flask服務(wù)端響應(yīng)與重定向處理的實(shí)現(xiàn)
flask響應(yīng)
flask默認(rèn)支持2種響應(yīng)方式:
數(shù)據(jù)響應(yīng): 默認(rèn)響應(yīng)html文本,也可以返回 JSON格式,或其他媒體類型文件
頁(yè)面響應(yīng): 重定向
? url_for 視圖之間的跳轉(zhuǎn)
響應(yīng)的時(shí)候,flask也支持自定義http響應(yīng)狀態(tài)碼
響應(yīng)html文本
視圖函數(shù)返回,即是響應(yīng)結(jié)果
1.返回字符串
return "123"
postman請(qǐng)求,看下響應(yīng)結(jié)果
響應(yīng)結(jié)果默認(rèn)是html頁(yè)面
#如果類型不是response對(duì)象,則視圖的返回值會(huì)被作為response對(duì)象的實(shí)例參數(shù)返回客戶端
#以元祖方式返回,第一個(gè)參數(shù)是html文本,第二個(gè)參數(shù)是響應(yīng)狀態(tài)碼,第三個(gè)參數(shù)是響應(yīng)頭信息,字典方式傳參
return "<h1>hello</h1>", 400, {"company": "python"}
瀏覽器訪問(wèn),查看響應(yīng)內(nèi)容,應(yīng)狀態(tài)碼,響應(yīng)頭字段
2.可以借助make_response()函數(shù)來(lái)返回Response對(duì)象
需要導(dǎo)包 make_response
from flask import Flask,make_response return make_response("<h1>hello</h1>", 400, {"study": "flask"})
瀏覽器訪問(wèn)
3.通過(guò)Response返回Response對(duì)象
需要導(dǎo)包
from flask import Flask,Response
我們看下源碼Response參數(shù)
瀏覽器訪問(wèn),查看響應(yīng),狀態(tài)碼被修改,帶上了響應(yīng)頭
完整代碼:
from flask import Flask,make_response, Response app = Flask(__name__) app.config.update({ "DEBUG": True }) @app.route("/") def index(): # 默認(rèn)返回的就是HTML代碼,在flask內(nèi)部調(diào)用視圖時(shí),得到的返回值會(huì)被flask判斷類型, #隨意返回個(gè)字符串,默認(rèn)響應(yīng)結(jié)果是html頁(yè)面 # return "123" # 如果類型不是response對(duì)象,則視圖的返回值會(huì)被作為response對(duì)象的實(shí)例參數(shù)返回客戶端 #以元祖方式返回,第一個(gè)參數(shù)是html文本,第二個(gè)參數(shù)是響應(yīng)狀態(tài)碼,第三個(gè)參數(shù)是響應(yīng)頭信息,字典方式傳參 # return "<h1>hello</h1>", 400, {"company": "python"} #可以借助make_response()函數(shù)來(lái)返回Response對(duì)象 # return make_response("<h1>hello</h1>", 400, {"study": "flask"}) # 通過(guò)Response返回Response對(duì)象 return Response(f"默認(rèn)首頁(yè)", 201, {"company": "python"}) if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
返回JSON數(shù)據(jù)
1.響應(yīng)json數(shù)據(jù)[原生寫(xiě)法]
data = {"name": "小明", "age": 16} #一定要加上content-type響應(yīng)頭,否則響應(yīng)的為html頁(yè)面 return json.dumps(data,ensure_ascii=False), 200, {"Content-Type": "application/json"}
瀏覽器訪問(wèn)
#也可以用Response返回json return Response(json.dumps(data), 200, {"Content-Type": "application/json"})
2.返回json格式數(shù)據(jù),返回各種json數(shù)據(jù),包括列表,jsonify寫(xiě)法
jsonify返回的是一個(gè)Response對(duì)象
在 Flask 中可以直接使用 jsonify 生成一個(gè) JSON 的響應(yīng)
需要導(dǎo)包
from flask import Flask, jsonify data = [ {"id": 1, "username": "liulaoshi", "age": 18}, {"id": 2, "username": "liulaoshi", "age": 17}, {"id": 3, "username": "liulaoshi", "age": 16}, {"id": 4, "username": "小明", "age": Decimal(15)}, ] return jsonify(data)
瀏覽器訪問(wèn),jsonify會(huì)自動(dòng)將響應(yīng)頭content-type設(shè)為 application/json
返回json完整代碼
from flask import Flask, jsonify, Response from decimal import Decimal import json app = Flask(__name__) # app.config.update({ # "JSONIFY_PRETTYPRINT_REGULAR": False, # "SON_AS_ASCII":False # }) @app.route("/") def index(): # """返回json格式數(shù)據(jù),返回json字典""" # data = {"name":"xiaoming","age":16} # return data """響應(yīng)json數(shù)據(jù)[原生寫(xiě)法]""" # data = {"name": "小明", "age": 16} #一定要加上content-type響應(yīng)頭,否則響應(yīng)的為html頁(yè)面 # return json.dumps(data,ensure_ascii=False), 200, {"Content-Type": "application/json"} #也可以用Response返回json # return Response(json.dumps(data), 200, {"Content-Type": "application/json"}) """返回json格式數(shù)據(jù),返回各種json數(shù)據(jù),包括列表,jsonify寫(xiě)法""" data = [ {"id": 1, "username": "liulaoshi", "age": 18}, {"id": 2, "username": "liulaoshi", "age": 17}, {"id": 3, "username": "liulaoshi", "age": 16}, {"id": 4, "username": "小明", "age": Decimal(15)}, ] return jsonify(data) if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
3.可能遇到的報(bào)錯(cuò)處理
如果遇到報(bào)錯(cuò) AttributeError: ‘Request’ object has no attribute ‘is_xhr’
解決方法:
將JSONIFY_PRETTYPRINT_REGULAR配置為False就能解決
app = Flask(__name__) app.config.update({ "JSONIFY_PRETTYPRINT_REGULAR": False, })
如果遇到返回的中文編碼不對(duì)
解決方法:
在flask配置文件配置:JSON_AS_ASCII = False # 支持中文
app.config.update({ "SON_AS_ASCII":False })
綜合對(duì)比,flask中返回json 數(shù)據(jù),都是flask的jsonify方法返回就可以了,直接return只能返回字典格式的json數(shù)據(jù)。
響應(yīng)指定媒體類型文件
響應(yīng)圖片給客戶端
先看下原圖片
視圖函數(shù)
@app.route("/img") def img(): """響應(yīng)圖片格式給客戶端""" with open("對(duì)稱加密.png", "rb") as f: data = f.read() return data, 200, {"Content-Type": "image/png"} # MIME類型
瀏覽器訪問(wèn),能訪問(wèn)到圖片數(shù)據(jù)
不僅僅可以響應(yīng)圖片類型數(shù)據(jù),視頻音頻,壓縮包等等都可以
只要知道該文件的MIME類型就可以
常見(jiàn)的MIME類型網(wǎng)上一查一大堆
重定向
1.重定向到站外地址
需要導(dǎo)包redirect
from flask import Flask, redirect
redirect參數(shù)
視圖函數(shù):
@app.route("/") def index(): """頁(yè)面跳轉(zhuǎn)""" """ 301: 永久重定向,頁(yè)面已經(jīng)沒(méi)有了,站點(diǎn)沒(méi)有了,永久轉(zhuǎn)移了。 302:臨時(shí)重定向,一般驗(yàn)證失敗、訪問(wèn)需要權(quán)限的頁(yè)面進(jìn)行登錄跳轉(zhuǎn)時(shí),都是屬于臨時(shí)跳轉(zhuǎn)。 """ # redirect函數(shù)就是response對(duì)象的頁(yè)面跳轉(zhuǎn)的封裝 response = redirect("https://www.baidu.com", 302) return response
redirect的原理,最終還是借助Resonse對(duì)象來(lái)實(shí)現(xiàn):
# redirect的原理,最終還是借助Resonse對(duì)象來(lái)實(shí)現(xiàn): response = "", 302, {"Location": "https://www.baidu.com"} return response
完整代碼:
from flask import Flask, redirect # 應(yīng)用實(shí)例對(duì)象 app = Flask(__name__) @app.route("/") def index(): """頁(yè)面跳轉(zhuǎn)""" """ 301: 永久重定向,頁(yè)面已經(jīng)沒(méi)有了,站點(diǎn)沒(méi)有了,永久轉(zhuǎn)移了。 302:臨時(shí)重定向,一般驗(yàn)證失敗、訪問(wèn)需要權(quán)限的頁(yè)面進(jìn)行登錄跳轉(zhuǎn)時(shí),都是屬于臨時(shí)跳轉(zhuǎn)。 """ # redirect函數(shù)就是response對(duì)象的頁(yè)面跳轉(zhuǎn)的封裝 # response = redirect("https://www.baidu.com", 302) # redirect的原理,最終還是借助Resonse對(duì)象來(lái)實(shí)現(xiàn): response = "", 302, {"Location": "https://www.baidu.com"} return response if __name__ == '__main__': # 啟動(dòng)項(xiàng)目的web應(yīng)用程序 app.run(host="0.0.0.0", port=5000, debug=True)
2.重定向到站內(nèi)自己寫(xiě)的視圖函數(shù)
可以直接填寫(xiě)自己 url 路徑
也可以使用 url_for 生成指定視圖函數(shù)所對(duì)應(yīng)的 url
from flask import url_for
我們判斷在查詢參數(shù)中是否有token,來(lái)決定是否需要跳轉(zhuǎn)到登錄頁(yè)面
from flask import Flask, redirect, Response,request from flask import url_for # 應(yīng)用實(shí)例對(duì)象 app = Flask(__name__) @app.route("/user") def index(): if request.args.get("token"): print('token',request.args.get("token")) return "個(gè)人中心" # 跳轉(zhuǎn)頁(yè)面到登錄視圖中 # redirect("url地址") # 控制頁(yè)面跳轉(zhuǎn)到任意路徑下 # return redirect("/login") # 跳轉(zhuǎn)頁(yè)面到其他視圖中 url = url_for("login") # url_for("視圖名稱") print(app.url_map) # 路由列表,整個(gè)flask站點(diǎn)中所有的url地址和視圖的映射關(guān)系都在這個(gè)屬性里面 print(url) return redirect(url) @app.route("/login") def login(): return "登錄視圖" if __name__ == '__main__': # 啟動(dòng)項(xiàng)目的web應(yīng)用程序 app.run(host="0.0.0.0", port=5000, debug=True)
瀏覽器訪問(wèn),第一次,我們查詢參數(shù)不帶token,頁(yè)面跳轉(zhuǎn)到了登錄視圖
http://127.0.0.1:5000/user
app.url_map 返回整個(gè)站點(diǎn)所有的url地址和視圖的映射關(guān)系
查詢參數(shù)帶上token,直接進(jìn)入到個(gè)人中心
http://127.0.0.1:5000/user?token=www
3.重定向到帶有路徑參數(shù)的視圖函數(shù)
在 url_for 函數(shù)中傳入?yún)?shù)
from flask import Flask, redirect, url_for # 應(yīng)用實(shí)例對(duì)象 app = Flask(__name__) @app.route("/demo/<int:mob>") def mobile(mob): print(mob) return f"mobile={mob}" @app.route("/sms") def sms(): """攜帶路徑參數(shù)進(jìn)行站內(nèi)跳轉(zhuǎn)""" # url_for("視圖方法名", 路由路徑參數(shù)名=路由參數(shù)值) url = url_for("mobile", mob=13312345678) print(url) return redirect(url) if __name__ == '__main__': # 啟動(dòng)項(xiàng)目的web應(yīng)用程序 app.run(host="0.0.0.0", port=5000, debug=True)
在瀏覽器訪問(wèn)http://127.0.0.1:5000/sms,就會(huì)跳轉(zhuǎn)到http://127.0.0.1:5000/demo/13312345678
總結(jié):
到此這篇關(guān)于flask服務(wù)端響應(yīng)與重定向處理的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)flask服務(wù)端響應(yīng)與重定向內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
網(wǎng)易2016研發(fā)工程師編程題 獎(jiǎng)學(xué)金(python)
這篇文章主要為大家詳細(xì)介紹了網(wǎng)易2016研發(fā)工程師編程題:獎(jiǎng)學(xué)金(python),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06使用Pandas計(jì)算系統(tǒng)客戶名稱的相似度
在日常業(yè)務(wù)處理中,我們經(jīng)常會(huì)面臨將不同系統(tǒng)中的數(shù)據(jù)進(jìn)行匹配和比對(duì)的情況,本文將介紹如何使用Python的Pandas庫(kù)來(lái)處理這個(gè)問(wèn)題,需要的可以參考一下2023-07-07Python實(shí)現(xiàn)接受任意個(gè)數(shù)參數(shù)的函數(shù)方法
下面小編就為大家分享一篇Python實(shí)現(xiàn)接受任意個(gè)數(shù)參數(shù)的函數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04python socket多線程通訊實(shí)例分析(聊天室)
這篇文章主要介紹了python socket多線程通訊方法,以聊天室程序?qū)嵗治隽薖ython基于Socket實(shí)現(xiàn)多線程通信的相關(guān)技巧,需要的朋友可以參考下2016-04-04python如何發(fā)布自已pip項(xiàng)目的方法步驟
這篇文章主要介紹了python如何發(fā)布自已pip項(xiàng)目的方法步驟,方便大家學(xué)習(xí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10詳解Python如何在多層循環(huán)中使用break/continue
關(guān)于break/continue這兩個(gè)關(guān)鍵字在平常的使用過(guò)程中一直比較迷糊。所以本文將詳細(xì)講講Python如何在多層循環(huán)中使用break/continue,需要的可以參考一下2022-05-05