python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié)
flask響應(yīng)
flask默認(rèn)支持2種響應(yīng)方式:
數(shù)據(jù)響應(yīng): 默認(rèn)響應(yīng)html文本,也可以返回 JSON格式,或其他媒體類型文件
頁面響應(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請求,看下響應(yīng)結(jié)果
響應(yīng)結(jié)果默認(rèn)是html頁面
#如果類型不是response對象,則視圖的返回值會被作為response對象的實(shí)例參數(shù)返回客戶端
#以元祖方式返回,第一個(gè)參數(shù)是html文本,第二個(gè)參數(shù)是響應(yīng)狀態(tài)碼,第三個(gè)參數(shù)是響應(yīng)頭信息,字典方式傳參
return "<h1>hello</h1>", 400, {"company": "python"}
瀏覽器訪問,查看響應(yīng)內(nèi)容,應(yīng)狀態(tài)碼,響應(yīng)頭字段
2.可以借助make_response()函數(shù)來返回Response對象
需要導(dǎo)包 make_response
from flask import Flask,make_response return make_response("<h1>hello</h1>", 400, {"study": "flask"})
瀏覽器訪問
3.通過Response返回Response對象
需要導(dǎo)包
from flask import Flask,Response
我們看下源碼Response參數(shù)
瀏覽器訪問,查看響應(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í),得到的返回值會被flask判斷類型, #隨意返回個(gè)字符串,默認(rèn)響應(yīng)結(jié)果是html頁面 # return "123" # 如果類型不是response對象,則視圖的返回值會被作為response對象的實(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ù)來返回Response對象 # return make_response("<h1>hello</h1>", 400, {"study": "flask"}) # 通過Response返回Response對象 return Response(f"默認(rèn)首頁", 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ù)[原生寫法]
data = {"name": "小明", "age": 16} #一定要加上content-type響應(yīng)頭,否則響應(yīng)的為html頁面 return json.dumps(data,ensure_ascii=False), 200, {"Content-Type": "application/json"}
瀏覽器訪問
#也可以用Response返回json return Response(json.dumps(data), 200, {"Content-Type": "application/json"})
2.返回json格式數(shù)據(jù),返回各種json數(shù)據(jù),包括列表,jsonify寫法
jsonify返回的是一個(gè)Response對象
在 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)
瀏覽器訪問,jsonify會自動(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ù)[原生寫法]""" # data = {"name": "小明", "age": 16} #一定要加上content-type響應(yīng)頭,否則響應(yīng)的為html頁面 # 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寫法""" 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, })
如果遇到返回的中文編碼不對
解決方法:
在flask配置文件配置:JSON_AS_ASCII = False # 支持中文
app.config.update({ "SON_AS_ASCII":False })
綜合對比,flask中返回json 數(shù)據(jù),都是flask的jsonify方法返回就可以了,直接return只能返回字典格式的json數(shù)據(jù)。
響應(yīng)指定媒體類型文件
響應(yīng)圖片給客戶端
先看下原圖片
視圖函數(shù)
@app.route("/img") def img(): """響應(yīng)圖片格式給客戶端""" with open("對稱加密.png", "rb") as f: data = f.read() return data, 200, {"Content-Type": "image/png"} # MIME類型
瀏覽器訪問,能訪問到圖片數(shù)據(jù)
不僅僅可以響應(yīng)圖片類型數(shù)據(jù),視頻音頻,壓縮包等等都可以
只要知道該文件的MIME類型就可以
常見的MIME類型網(wǎng)上一查一大堆
重定向
1.重定向到站外地址
需要導(dǎo)包redirect
from flask import Flask, redirect
redirect參數(shù)
視圖函數(shù):
@app.route("/") def index(): """頁面跳轉(zhuǎn)""" """ 301: 永久重定向,頁面已經(jīng)沒有了,站點(diǎn)沒有了,永久轉(zhuǎn)移了。 302:臨時(shí)重定向,一般驗(yàn)證失敗、訪問需要權(quán)限的頁面進(jìn)行登錄跳轉(zhuǎn)時(shí),都是屬于臨時(shí)跳轉(zhuǎn)。 """ # redirect函數(shù)就是response對象的頁面跳轉(zhuǎn)的封裝 response = redirect("https://www.qq.com", 302) return response
瀏覽器訪問,重定向成功
redirect的原理,最終還是借助Resonse對象來實(shí)現(xiàn):
# redirect的原理,最終還是借助Resonse對象來實(shí)現(xiàn): response = "", 302, {"Location": "https://www.163.com"} return response
瀏覽器訪問,跳轉(zhuǎn)成功
完整代碼:
from flask import Flask, redirect # 應(yīng)用實(shí)例對象 app = Flask(__name__) @app.route("/") def index(): """頁面跳轉(zhuǎn)""" """ 301: 永久重定向,頁面已經(jīng)沒有了,站點(diǎn)沒有了,永久轉(zhuǎn)移了。 302:臨時(shí)重定向,一般驗(yàn)證失敗、訪問需要權(quán)限的頁面進(jìn)行登錄跳轉(zhuǎn)時(shí),都是屬于臨時(shí)跳轉(zhuǎn)。 """ # redirect函數(shù)就是response對象的頁面跳轉(zhuǎn)的封裝 # response = redirect("https://www.qq.com", 302) # redirect的原理,最終還是借助Resonse對象來實(shí)現(xiàn): response = "", 302, {"Location": "https://www.163.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)自己寫的視圖函數(shù)
可以直接填寫自己 url 路徑
也可以使用 url_for 生成指定視圖函數(shù)所對應(yīng)的 url
from flask import url_for
我們判斷在查詢參數(shù)中是否有token,來決定是否需要跳轉(zhuǎn)到登錄頁面
from flask import Flask, redirect, Response,request from flask import url_for # 應(yīng)用實(shí)例對象 app = Flask(__name__) @app.route("/user") def index(): if request.args.get("token"): print('token',request.args.get("token")) return "個(gè)人中心" # 跳轉(zhuǎn)頁面到登錄視圖中 # redirect("url地址") # 控制頁面跳轉(zhuǎn)到任意路徑下 # return redirect("/login") # 跳轉(zhuǎn)頁面到其他視圖中 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)
瀏覽器訪問,第一次,我們查詢參數(shù)不帶token,頁面跳轉(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í)例對象 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)
在瀏覽器訪問http://127.0.0.1:5000/sms,就會跳轉(zhuǎn)到http://127.0.0.1:5000/demo/13312345678
總結(jié):
綜上就是flask服務(wù)端各種響應(yīng)類型和重定向的各種用法,相當(dāng)全面,falsk持續(xù)更新中?。。?/p>
到此這篇關(guān)于python flask服務(wù)端響應(yīng)與重定向處理的文章就介紹到這了,更多相關(guān)python flask服務(wù)端響應(yīng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python神經(jīng)網(wǎng)絡(luò)Keras實(shí)現(xiàn)GRU及其參數(shù)量
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Keras實(shí)現(xiàn)GRU及其參數(shù)量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python中print()函數(shù)的“,”與java中System.out.print()函數(shù)中的“+”功能詳解
python中的print()函數(shù)和java中的System.out.print()函數(shù)都有著打印字符串的功能。接下來通過本文給大家分享python中print()函數(shù)的“,”與java中System.out.print()函數(shù)中的“+”功能,需要的朋友參考下吧2017-11-11Python2.7+pytesser實(shí)現(xiàn)簡單驗(yàn)證碼的識別方法
這篇文章主要介紹了Python2.7+pytesser實(shí)現(xiàn)簡單驗(yàn)證碼的識別方法,簡單分析了pytesser的安裝及Python2.7環(huán)境下實(shí)現(xiàn)驗(yàn)證碼識別的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Python除法之傳統(tǒng)除法、Floor除法及真除法實(shí)例詳解
本文通過實(shí)例代碼給大家介紹了Python除法之傳統(tǒng)除法、Floor除法及真除法,需要的朋友可以參考下2019-05-05python flask解析json數(shù)據(jù)不完整的解決方法
這篇文章主要介紹了python flask解析json數(shù)據(jù)不完整的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05Python爬蟲基礎(chǔ)之爬蟲的分類知識總結(jié)
來給大家講python爬蟲的基礎(chǔ)啦,首先我們從爬蟲的分類開始講起,下文有非常詳細(xì)的知識總結(jié),對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05python中利用Future對象異步返回結(jié)果示例代碼
future是一種對象,表示異步執(zhí)行的操作。下面這篇文章主要給大家介紹了關(guān)于python中利用Future對象異步返回結(jié)果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Python操作Elasticsearch處理timeout超時(shí)
這篇文章主要介紹了Python操作Elasticsearch處理timeout超時(shí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07