欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié)

 更新時(shí)間:2024年03月20日 09:58:20   作者:景天科技苑  
這篇文章主要介紹了python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(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)文章

最新評論