Flask框架(三):請求與響應

1、處理請求

需求:當客戶端發送請求並攜帶數據給服務端訪問視圖函數時,如何才能正確的取出數據呢?html

請求攜帶的數據可能出如今HTTP報文中的不一樣位置,須要使用不一樣的方法來獲取參數。程序員

1. URL路徑參數(動態路由)

例如,有一個請求訪問的接口地址爲/users/123,其中123實際上爲具體的請求參數,代表請求123號用戶的信息。此時如何從url中提取出123的數據?正則表達式

Flask不一樣於Django直接在定義路由時編寫正則表達式的方式,而是採用轉換器語法:json

@app.route('/users/<user_id>')
def user_info(user_id):
    print(type(user_id))
    return 'hello user {}'.format(user_id)

此處的<>便是一個轉換器,默認爲字符串類型,即將該位置的數據以字符串格式進行匹配、並以字符串爲數據類型類型、 user_id爲參數名傳入視圖。flask

Flask也提供其餘類型的轉換器:

DEFAULT_CONVERTERS = {
    'default':      UnicodeConverter,
    'string':       UnicodeConverter,
    'any':          AnyConverter,
    'path':         PathConverter,
    'int':          IntegerConverter,
    'float':        FloatConverter,
    'uuid':         UUIDConverter,
}

將上面的例子以整型匹配數據,能夠以下使用:服務器

@app.route('/users/<int:user_id>')
def user_info(user_id):
    print(type(user_id))
    return 'hello user {}'.format(user_id)


@app.route('/users/<int(min=1):user_id>')
def user_info(user_id):
    print(type(user_id))
    return 'hello user {}'.format(user_id)

自定義轉換器:若是遇到須要匹配提取/sms_codes/18512345678中的手機號數據,Flask內置的轉換器就沒法知足需求,此時須要自定義轉換器。cookie

 

自定義轉換器主要作3步session

 

  1. 建立轉換器類,保存匹配時的正則表達式app

    from werkzeug.routing import BaseConverter
    
    class MobileConverter(BaseConverter):
        """
        手機號格式
        """
        regex = r'1[3-9]\d{9}'  # 使用正則表達式匹配手機號

     

    • 注意regex名字固定
  2. 將自定義的轉換器告知Flask應用函數

    app = Flask(__name__)
    
    # 將自定義轉換器添加到轉換器字典中,並指定轉換器使用時名字爲: mobile
    app.url_map.converters['mobile'] = MobileConverter
  3. 在使用轉換器的地方定義使用

    @app.route('/sms_codes/<mobile:mob_num>')
    def send_sms_code(mob_num):
        return 'send sms code to {}'.format(mob_num)

     

2. 其餘參數

若是想要獲取其餘地方傳遞的參數,能夠經過Flask提供的request對象來讀取。

不一樣位置的參數都存放在request的不一樣屬性中

屬性 說明 類型
data 記錄請求的數據,並轉換爲字符串 *
form 記錄請求中的表單數據 MultiDict
args 記錄請求中的查詢參數 MultiDict
cookies 記錄請求中的cookie信息 Dict
headers 記錄請求中的報文頭 EnvironHeaders
method 記錄請求使用的HTTP方法 GET/POST
url 記錄請求的URL地址 string
files 記錄請求上傳的文件 *

例如 想要獲取請求/articles?channel_id=1channel_id的參數,能夠按以下方式使用:

from flask import request

@app.route('/articles')
def get_articles():
    channel_id = request.args.get('channel_id')
    return 'you wanna get articles of channel {}'.format(channel_id)

上傳圖片

客戶端上傳圖片到服務器,並保存到服務器中

from flask import request

@app.route('/upload', methods=['POST'])
def upload_file():
    f = request.files['pic']
    # with open('./demo.png', 'wb') as new_file:
    #     new_file.write(f.read())
    f.save('./demo.png')
    return 'ok'

 

2、處理響應

需求:如何在不一樣的場景裏返回不一樣的響應

 

1.返回模板

使用render_template方法渲染模板並返回

from flask import render_template

@app.route('/')
def index():
    mstr = 'Hello 黑馬程序員'
    mint = 10
    return render_template('index.html', my_str=mstr, my_int=mint)

2.重定向

from flask import redirect

@app.route('/demo2')
def demo2():
    return redirect('http://www.itheima.com')

3.返回JSON

from flask import jsonify

@app.route('/demo3')
def demo3():
    json_dict = {
        "user_id": 10,
        "user_name": "laowang"
    }
    return jsonify(json_dict)

4.自定義狀態碼和響應頭

1) 元組方式

能夠返回一個元組,這樣的元組必須是 (response, status, headers) 的形式,且至少包含一個元素。 status 值會覆蓋狀態代碼, headers 能夠是一個列表或字典,做爲額外的消息標頭值。

@app.route('/demo4')
def demo4():
    # return '狀態碼爲 666', 666
    # return '狀態碼爲 666', 666, [('Itcast', 'Python')]
    return '狀態碼爲 666', 666, {'Itcast': 'Python'}

2) make_response方式

@app.route('/demo5')
def demo5():
    resp = make_response('make response測試')
        resp.headers[「Itcast」] = 「Python」
        resp.status = 「404 not found」
    return resp

3、Cookie與Session

設置

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/cookie')
def set_cookie():
    resp = make_response('set cookie ok')
    resp.set_cookie('username', 'itcast')
    return resp

設置有效期

@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('username', 'itheima', max_age=3600)
    return response

讀取

from flask import request

@app.route('/get_cookie')
def get_cookie():
    resp = request.cookies.get('username')
    return resp

刪除

from flask import request

@app.route('/delete_cookie')
def delete_cookie():
    response = make_response('hello world')
    response.delete_cookie('username')
    return response

2 Session

須要先設置SECRET_KEY

class DefaultConfig(object):
    SECRET_KEY = 'fih9fh9eh9gh2'

app.config.from_object(DefaultConfig)

或者直接設置

app.secret_key='xihwidfw9efw'

設置

from flask import session

@app.route('/set_session')
def set_session():
    session['username'] = 'itcast'
    return 'set session ok'

讀取

@app.route('/get_session')
def get_session():
    username = session.get('username')
    return 'get session username {}'.format(username)
相關文章
相關標籤/搜索