flask服務端響應與重定向處理的實現(xiàn)
flask響應
flask默認支持2種響應方式:
數(shù)據(jù)響應: 默認響應html文本,也可以返回 JSON格式,或其他媒體類型文件
頁面響應: 重定向
? url_for 視圖之間的跳轉
響應的時候,flask也支持自定義http響應狀態(tài)碼
響應html文本
視圖函數(shù)返回,即是響應結果
1.返回字符串
return "123"

postman請求,看下響應結果

響應結果默認是html頁面

#如果類型不是response對象,則視圖的返回值會被作為response對象的實例參數(shù)返回客戶端
#以元祖方式返回,第一個參數(shù)是html文本,第二個參數(shù)是響應狀態(tài)碼,第三個參數(shù)是響應頭信息,字典方式傳參
return "<h1>hello</h1>", 400, {"company": "python"}
瀏覽器訪問,查看響應內容,應狀態(tài)碼,響應頭字段

2.可以借助make_response()函數(shù)來返回Response對象
需要導包 make_response
from flask import Flask,make_response
return make_response("<h1>hello</h1>", 400, {"study": "flask"})

瀏覽器訪問

3.通過Response返回Response對象
需要導包
from flask import Flask,Response
我們看下源碼Response參數(shù)


瀏覽器訪問,查看響應,狀態(tài)碼被修改,帶上了響應頭

完整代碼:
from flask import Flask,make_response, Response
app = Flask(__name__)
app.config.update({
"DEBUG": True
})
@app.route("/")
def index():
# 默認返回的就是HTML代碼,在flask內部調用視圖時,得到的返回值會被flask判斷類型,
#隨意返回個字符串,默認響應結果是html頁面
# return "123"
# 如果類型不是response對象,則視圖的返回值會被作為response對象的實例參數(shù)返回客戶端
#以元祖方式返回,第一個參數(shù)是html文本,第二個參數(shù)是響應狀態(tài)碼,第三個參數(shù)是響應頭信息,字典方式傳參
# 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"默認首頁", 201, {"company": "python"})
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
返回JSON數(shù)據(jù)
1.響應json數(shù)據(jù)[原生寫法]
data = {"name": "小明", "age": 16}
#一定要加上content-type響應頭,否則響應的為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返回的是一個Response對象
在 Flask 中可以直接使用 jsonify 生成一個 JSON 的響應
需要導包
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會自動將響應頭content-type設為 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
"""響應json數(shù)據(jù)[原生寫法]"""
# data = {"name": "小明", "age": 16}
#一定要加上content-type響應頭,否則響應的為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.可能遇到的報錯處理
如果遇到報錯 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ù)。
響應指定媒體類型文件
響應圖片給客戶端
先看下原圖片

視圖函數(shù)
@app.route("/img")
def img():
"""響應圖片格式給客戶端"""
with open("對稱加密.png", "rb") as f:
data = f.read()
return data, 200, {"Content-Type": "image/png"} # MIME類型
瀏覽器訪問,能訪問到圖片數(shù)據(jù)

不僅僅可以響應圖片類型數(shù)據(jù),視頻音頻,壓縮包等等都可以
只要知道該文件的MIME類型就可以
常見的MIME類型網(wǎng)上一查一大堆

重定向
1.重定向到站外地址
需要導包redirect
from flask import Flask, redirect
redirect參數(shù)

視圖函數(shù):
@app.route("/")
def index():
"""頁面跳轉"""
"""
301: 永久重定向,頁面已經沒有了,站點沒有了,永久轉移了。
302:臨時重定向,一般驗證失敗、訪問需要權限的頁面進行登錄跳轉時,都是屬于臨時跳轉。
"""
# redirect函數(shù)就是response對象的頁面跳轉的封裝
response = redirect("https://www.baidu.com", 302)
return response
redirect的原理,最終還是借助Resonse對象來實現(xiàn):
# redirect的原理,最終還是借助Resonse對象來實現(xiàn):
response = "", 302, {"Location": "https://www.baidu.com"}
return response

完整代碼:
from flask import Flask, redirect
# 應用實例對象
app = Flask(__name__)
@app.route("/")
def index():
"""頁面跳轉"""
"""
301: 永久重定向,頁面已經沒有了,站點沒有了,永久轉移了。
302:臨時重定向,一般驗證失敗、訪問需要權限的頁面進行登錄跳轉時,都是屬于臨時跳轉。
"""
# redirect函數(shù)就是response對象的頁面跳轉的封裝
# response = redirect("https://www.baidu.com", 302)
# redirect的原理,最終還是借助Resonse對象來實現(xiàn):
response = "", 302, {"Location": "https://www.baidu.com"}
return response
if __name__ == '__main__':
# 啟動項目的web應用程序
app.run(host="0.0.0.0", port=5000, debug=True)
2.重定向到站內自己寫的視圖函數(shù)
可以直接填寫自己 url 路徑
也可以使用 url_for 生成指定視圖函數(shù)所對應的 url
from flask import url_for
我們判斷在查詢參數(shù)中是否有token,來決定是否需要跳轉到登錄頁面
from flask import Flask, redirect, Response,request
from flask import url_for
# 應用實例對象
app = Flask(__name__)
@app.route("/user")
def index():
if request.args.get("token"):
print('token',request.args.get("token"))
return "個人中心"
# 跳轉頁面到登錄視圖中
# redirect("url地址") # 控制頁面跳轉到任意路徑下
# return redirect("/login")
# 跳轉頁面到其他視圖中
url = url_for("login") # url_for("視圖名稱")
print(app.url_map) # 路由列表,整個flask站點中所有的url地址和視圖的映射關系都在這個屬性里面
print(url)
return redirect(url)
@app.route("/login")
def login():
return "登錄視圖"
if __name__ == '__main__':
# 啟動項目的web應用程序
app.run(host="0.0.0.0", port=5000, debug=True)
瀏覽器訪問,第一次,我們查詢參數(shù)不帶token,頁面跳轉到了登錄視圖
http://127.0.0.1:5000/user

app.url_map 返回整個站點所有的url地址和視圖的映射關系

查詢參數(shù)帶上token,直接進入到個人中心
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
# 應用實例對象
app = Flask(__name__)
@app.route("/demo/<int:mob>")
def mobile(mob):
print(mob)
return f"mobile={mob}"
@app.route("/sms")
def sms():
"""攜帶路徑參數(shù)進行站內跳轉"""
# url_for("視圖方法名", 路由路徑參數(shù)名=路由參數(shù)值)
url = url_for("mobile", mob=13312345678)
print(url)
return redirect(url)
if __name__ == '__main__':
# 啟動項目的web應用程序
app.run(host="0.0.0.0", port=5000, debug=True)
在瀏覽器訪問http://127.0.0.1:5000/sms,就會跳轉到http://127.0.0.1:5000/demo/13312345678

總結:
到此這篇關于flask服務端響應與重定向處理的實現(xiàn)的文章就介紹到這了,更多相關flask服務端響應與重定向內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
網(wǎng)易2016研發(fā)工程師編程題 獎學金(python)
這篇文章主要為大家詳細介紹了網(wǎng)易2016研發(fā)工程師編程題:獎學金(python),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
Python實現(xiàn)接受任意個數(shù)參數(shù)的函數(shù)方法
下面小編就為大家分享一篇Python實現(xiàn)接受任意個數(shù)參數(shù)的函數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
詳解Python如何在多層循環(huán)中使用break/continue
關于break/continue這兩個關鍵字在平常的使用過程中一直比較迷糊。所以本文將詳細講講Python如何在多層循環(huán)中使用break/continue,需要的可以參考一下2022-05-05

