引言
客戶端發(fā)送 http 請求給 flask程序,flask 調(diào)用視圖函數(shù)后,會將其返回值作為響應(yīng)的內(nèi)容。大多情況下,響應(yīng)就是一個簡單的字符串,作為 html 頁面回送客戶端。
但 http 協(xié)議需要的不僅是作為請求響應(yīng)的字符串。http 響應(yīng)中有一個很重要的部分是狀態(tài)碼,flask設(shè)為200,代表請求已被成功處理。
response響應(yīng)
元組形式響應(yīng)
如果視圖函數(shù)返回的響應(yīng)還需要使用不同的狀態(tài)碼,那么可以把數(shù)字代碼作為第二個返回值,添加到響應(yīng)文本之后
1
2
3
4
5
6
7
8
9
10
|
from flask import flask app = flask(__name__) # 以元組形式返回響應(yīng)信息 @app.route( "/index" ) def index(): # 響應(yīng)體 狀態(tài)碼 return "index page" , 400 |
視圖函數(shù)返回的響應(yīng)還可以接受第三個參數(shù),響應(yīng)頭也可以繼續(xù)放在后面返回,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from flask import flask app = flask(__name__) # 以元組形式返回響應(yīng)信息 @app.route( "/index" ) def index(): header_dict = { "name" : "jack" , "age" : 22 } header_list = [( "name" , "hui" ), ( "age" , 21)] # 響應(yīng)體 狀態(tài)碼 響應(yīng)頭 return "index page" , 400, header_dict # return "index page", 400, header_list |
但響應(yīng)頭信息要用一個字典或列表包裝起來,字典好理解,列表里面則是以元組形式存儲響應(yīng)頭信息。這里返回的只是做個例子,真正返回的時候,要合理設(shè)置響應(yīng)頭信息,例如
1
2
3
4
5
|
header_dict = { "content-type" : " text/html; charset=utf-8" , # 響應(yīng)返回的數(shù)據(jù)類型 "set-cookie" : "name=hui; path=/" # 響應(yīng)設(shè)置cookie } return "index page" , 200, header_dict |
瀏覽器開發(fā)者工具查看響應(yīng)信息
切記:以元組形式返回,返回值位置不能夠亂
第一個對應(yīng)響應(yīng)體
第二個對應(yīng)狀態(tài)碼
第三個對應(yīng)響應(yīng)頭
make_response函數(shù)
如果不想返回由1個、2個或3個值組成的元組,flask視圖函數(shù)還可以返回 response 對象。make_response 函數(shù)可接受1個、2個或3個參數(shù)(和視圖函數(shù)的返回值一樣),并返回一個response對象。看看到底如何使用
1
2
3
4
5
6
7
8
9
10
11
12
|
from flask import flask, make_response app = flask(__name__) # mk_response 設(shè)置響應(yīng)信息 @app.route( "/info" ) def info(): resp = make_response( "info page" ) resp.status = "666 ithui" resp.headers[ "name" ] = "hui" resp.headers[ "age" ] = 21 return resp |
注意:make_response() 對象設(shè)置狀態(tài)碼時必須字符串,不要寫成了數(shù)字
返回json格式數(shù)據(jù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import json from flask import flask, make_response app = flask(__name__) @app.route( "/json" ) def resp_json(): data = { "name" : "hui" , "age" : 21 } json_str = json.dumps(data) headers = { "content-type" : "application/json" } return json_str, 200, headers |
你可以借助 json 模塊進行數(shù)據(jù) json化,但一般返回json數(shù)據(jù)要設(shè)置前端返回的數(shù)據(jù)類型,flask默認的是text/html,因此我們還需在單獨設(shè)置響應(yīng)體內(nèi)容類型。
由于json格式數(shù)據(jù)在web開發(fā)中使用頻繁,在 flask 中專門提供了 jsonify() 函數(shù)進行 json數(shù)據(jù)的響應(yīng)
具體使用如下
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from flask import flask, jsonify app = flask(__name__) @app.route( "/json" ) def resp_json(): data = { "name" : "hui" , "age" : 21 } return jsonify(data) # return jsonify(name="jack", age=20) |
jsonify()可以接收一個字典,也可以 key-value 形式來構(gòu)造 json 數(shù)據(jù)。這樣就方便許多
其他特殊響應(yīng)
redirect() 重定向
有一種名為重定向的特殊響應(yīng)類型。這種響應(yīng)類型沒有頁面文檔,只告訴瀏覽器一個新地址用以加載新頁面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from flask import flask, redirect app = flask(__name__) # 自己設(shè)置重定向信息 @app.route( '/baidu' ) def red_baidu(): resp = make_response() resp.status = "302" resp.headers[ 'location' ] = "http://www.baidu.com" return resp # redirect 響應(yīng)重定向 @app.route( "/csdn" ) def red_csdn(): csdn_url = "https://blog.csdn.net/qq_43629857" return redirect(csdn_url) |
重定向的經(jīng)常使用 302 狀態(tài)碼表示,指向的地址由 location 首部提供。由于使用頻繁,flask 提供了輔助函數(shù) redirect(),用于生成這種響應(yīng)。
abort() 中斷
abort()接收一個狀態(tài)碼參數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from flask import flask, request, abort app = flask(__name__) # abort中斷 # http://127.0.0.1:5000/login?name=hui&pwd=123 @app.route( "/login" , methods=[ 'get' ]) def login(): name = request.args.get( "name" ) pwd = request.args.get( "pwd" ) if name != "hui" or pwd != "123" : abort (404) return "登錄成功" |
一般這個 abort() 函數(shù)都會配合錯誤信息處理裝飾器 app.errorhandler() 一起使用,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 處理404狀態(tài)錯誤 @app.errorhandler(404) def handle_404_err(err): return f "404 錯誤信息 {err}" # 處理500狀態(tài)錯誤 @app.errorhandler(500) def handle_500_err(err): return f "500 服務(wù)器錯誤 {err}" # abort中斷 # http://127.0.0.1:5000/login?name=hui&pwd=123 @app.route( "/login" , methods=[ 'get' ]) def login(): name = request.args.get( "name" ) pwd = request.args.get( "pwd" ) if name != "hui" or pwd != "123" : abort (404) return "登錄成功" |
源代碼
源代碼已上傳到 gitee huidbk/flaskbasic - 碼云 - 開源中國 (gitee.com) ,歡迎大家來訪。
到此這篇關(guān)于flask response響應(yīng)的具體使用的文章就介紹到這了,更多相關(guān)flask response響應(yīng)內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://juejin.cn/post/6982450925759627277