1. 程式人生 > >Flask高階應用02--請求和反向解析

Flask高階應用02--請求和反向解析

一、請求和響應

1. 請求request

服務端在接收到客戶端的請求後,會自動建立Request物件,由Flask框架建立,Request物件不可修改

@blue.route('/request/',methods=['GET','POST','PUT'])
def get_request():
    # 請求上下文 request,
    # 獲取GET請求傳遞的引數:request.args.get(key)/request.args.getlist(key)
    # 獲取POST、PUT、PATCH、DELETE請求傳遞的引數: request.form.get(key)/request.form.getlist(key)
    # 判斷HTTP請求方式: request.method
    pass

屬性:

url:完整的請求地址

base_url:去掉GET引數的url

host_url:只有主機和埠號的url

path:路由中的路徑

method:請求方法

remote_addr:請求的客戶端的地址

args:GET請求引數

form:POST請求引數

files:檔案上傳

headers:請求頭

cookies:請求中的cookie
(1) args–>GET請求引數包裝

a)args是get請求引數的包裝,args是一個ImmutableMultiDict物件,類字典結構物件

b)資料儲存也是key-value

(2) form–>POST請求引數包裝

a)form是post請求引數的包裝,args是一個ImmutableMultiDict物件,類字典結構物件

b)資料儲存也是key-value

重點:ImmutableMultiDict是類似字典的資料結構,但是與字典的區別是,可以存在相同的鍵。

在ImmutableMultiDict中獲取資料的方式,dict[‘key’]或者dict.get(‘key’)或者dict.getlist(‘key’)

2.響應(make_response命令)

Response是由開發者自己建立的

建立方法:

from flask import make_response

make_response建立一個響應,是一個真正的Response物件

狀態碼:

格式:make_reponse(data,code),其中data是返回的資料內容,code是狀態碼

a)直接將內容當做make_response的第一個引數,第二個引數直接寫返回的狀態碼

b)直接在render後加返回的狀態碼

例子1:

定義一個獲取GET請求的request的方法,並將返回成功的請求的狀態碼修改為200

@blue.route('/getrequest/', methods=['GET'])
def get_request():

    print(request)
    
    return '獲取request', 200

例子2:

返回response響應,並新增返回結果的狀態碼200

@blue.route('/getresponse/')
def get_response():
    response = make_response('<h2>我是響應</h2>', 500)
    return response

或者:

@blue.route('/getresponse/', methods=['GET'])
def get_user_response():
    login_html = render_template('login.html')
    res = make_response(login_html, 200)
    return res

3. 重定向/反向解析

redirect 重定向操作,這個和django中類似
url_for('藍圖定義的名稱.方法名')

例子1:

定義跳轉方法,跳轉到get_response的方法上

@blue.route('/getredirect/')
def get_redirect():

    return redirect('getresponse')

例子2:

使用url_for反向解析

from flask import redirect, url_for

@blue.route('/getredirect/')
def get_redirect():

    return redirect(url_for('first.get_response'))

4. 終止/異常捕獲

自動丟擲異常:abort(狀態碼)

捕獲異常處理:errorhandler(狀態碼),定義的函式中要包含一個引數,用於接收異常資訊

(1 )定義終止程式
@blue.route('/make_abort/')
def get_abort():
    abort(400)
    return '終止'
(2 )捕獲定義的異常
@blue.errorhandler(400)
def handler(exception):

    return '捕獲到異常資訊:%s' % exception

【例】

@blue.route('/index/',methods=['GET'])
def index():
    a = int(request.args.get('a'))
    b = int(request.args.get('b'))
    try:
        a/b
    except Exception as e:
        print(e)
        # 丟擲異常
        abort(500)
    return render_template('index.html')


@blue.errorhandler(500)
def erro500(exception):
    return '捕捉異常,錯誤資訊為: %s' % exception