基本用法
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) # 第二種添加路由的方式,本質不變