Flask 中的路由系統

基本用法

Django的路由系統url集中在一塊兒,而Flask的路由系統以裝飾器的形式裝飾在視圖上如:javascript

@app.route("/",methods=["GET","POST"])html

@app.route() 裝飾器中的參數

第一個位置參數表明路由地址java

methods : 當前 url 地址,容許訪問的請求方式

如下例子包含部分request的方法取值git

複製代碼
@app.route('/get_request', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        print(request.args.get('id')) # url中的數據
        print(request.args.to_dict())
        # 雜項
        print('1>>>',request.url)  # 整個訪問地址
        print('2>>>',request.values)  # args和from全部的數據 這兒有深坑,不要用to_dict,
        print('3>>>',request.path)  # 路由地址
        print('4>>>',request.base_url) # 最基礎的url
        print('5>>>',request.host) # 主機地址
        print('6>>>',request.host_url)

        ## 兩個特殊值
        print(request.json)  # 請求頭:Content-type:application/json
        print(request.data)  # 當請求頭 不被承認的狀況 存放原始數據 b"" + Content-type:application/json 也會保留原始數據

        return render_template('login.html')
    else:
        print(request.form.get('username'))  # FormDate中的數據
        print(request.form.to_dict())  # 以字典形式打印出來

        return request.form.get('username', '錯誤')
複製代碼

endpoint : 反向url地址

複製代碼
from flask import url_for


@app.route("/info", methods=["GET", "POST"], endpoint="r_info")
def student_info():
    print(url_for("r_info"))  # /info
    stu_id = int(request.args["id"])
    return f"Hello {stu_id}"  # Python3.6的新特性 f"{變量名}"
複製代碼

 

endpoint   默認是視圖函數名 ,url_for 反向生成URL地址 ——能夠解決視圖函數重名:json

複製代碼
@app.route("/detail",methods=["GET","POST"]) # route(detail) -> nei_func --> detail
@wai_func  # wai_func(detail) -> nei_func --> deltail
def detail():
    return render_template("detail.html")


@app.route("/detail2",methods=["GET","POST"]) # route(detail) -> nei_func --> detail
@wai_func
def detail2():
    return render_template("detail.html")
複製代碼

上面例子中,運行會報這樣的錯誤flask

這是由於裝飾器的機制會使兩個路由都指向裝飾器的內層函數nei_func ,就會出現函數重名的報錯瀏覽器

若是加上endpoint就不會有這樣的問題了微信

複製代碼
@app.route("/detail",methods=["GET","POST"],endpoint='detil') # route(detail) -> nei_func --> detail
@wai_func  # wai_func(detail) -> nei_func --> deltail
def detail():
    return render_template("detail.html")


@app.route("/detail2",methods=["GET","POST"],endpoint='detil2') # route(detail) -> nei_func --> detail
@wai_func
def detail2():
    return render_template("detail.html")
複製代碼

項目已經成功運行了app

defaults : 視圖函數的參數默認值{"nid":1}

傳遞默認參數 defaults={"nid":1} def index(nid)dom

strict_slashes 

 url地址結尾符"/"的控制 False : 不管結尾 "/" 是否存在都可以訪問 , True : 結尾必須不能是 "/"

是否嚴格遵照URL地址規則 == True 在地址末尾不能夠出現 / 反之能夠

redirect_to : url地址重定向

永久重定向 "/infos" http 狀態碼 - 301  不走被裝飾的視圖

複製代碼
# 訪問地址 : /info 瀏覽器跳轉至 /infos
@app03.route("/info", strict_slashes=True, redirect_to="/infos")
def student_info():
    return "Hello I'm info"

@app03.route("/infos", strict_slashes=False)
def student_infos():
    return "Hello I'm infos"
複製代碼

subdomain

子域名配置 必須和 app中的 SERVER_NAME 聯動

子域名前綴 subdomian="DragonFire" 這樣寫能夠獲得 DragonFire.zwq.com 前提是app.config["SERVER_NAME"] = "zwq.com"

複製代碼
app.config["SERVER_NAME"] = "zwq.com"

@app.route("/info",subdomain="DragonFire")
def student_info():
    return "Hello Old boy info"

# 訪問地址爲:  DragonFire.zwq.com/info
複製代碼

動態參數路由

複製代碼
from flask import url_for


# 訪問地址 : http://127.0.0.1:5000/info/1
@app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info")
def student_info(nid):
    print(url_for("r_info",nid=2))  # /info/2
    return f"Hello {nid}" 
複製代碼

<int:nid> 就是在url後定義一個參數接收

可是這種動態參數路由,在url_for的時候,必定要將動態參數名+參數值添加進去,不然會拋出參數錯誤的異常

 添加路由的另外一種方法

經過分析源碼得知添加路由本質上就是這種方法:add_url_rule("/login",view_func=login)
因此能夠直接經過add_url_rule()添加路由
def login():
    print(url_for("my_home_page"))
    # print(url_for("index2"))
    return ""

app.add_url_rule("/login",view_func=login) # 第二種添加路由的方式,本質不變

 

 
 
分類: Flask
 
0
0
 
 
 
« 上一篇: Flask 中內置的 Session
» 下一篇: 關於類的特殊方法的小實驗
相關文章
相關標籤/搜索