1. 使用裝飾器裝飾兩個視圖函數,代碼以下 : html
from flask import Flask, redirect, render_template, request, session app = Flask(__name__) app.secret_key = "wanglili" # 裝飾器函數 def outer(func): def inner(*args, **kwargs): if session.get("user"): # 驗證session ret = func(*args, **kwargs) return ret else: return redirect("/login") return inner @app.route("/") @outer # inner=outer(index) def index(): return render_template("index.html") @app.route("/course") @outer def course(): return render_template("course.html") @app.route("/login", methods=["POST", "GET"]) def login(): if request.method == "GET": return render_template("login.html") if request.form.get("username") == "wll"and request.form.get("password") == "123": session["user"] = request.form.get("username") # 寫入session return redirect("/") return render_template("login.html") app.run(debug=True)
啓動程序後有以下錯誤 : flask
咱們還發現當裝飾一個視圖函數時能夠正常運行,而裝飾兩個或兩個以上的視圖函數則會報以上錯誤.瀏覽器
2 . 解決方法 session
1) . 方式一 : 使用functools模塊 app
import functools def outer(func): @functools.wraps(func) # 保留原函數func的信息 def inner(*args, **kwargs): if session.get("user"): ret = func(*args, **kwargs) return ret else: return redirect("/login") return inner
2) . 方式二 : 使用flask提供的endpoint參數dom
@app.route("/", endpoint='index') @outer def index(): return render_template("index.html") @app.route("/course", endpoint='course') @outer def course(): return render_template("course.html")
1. @app.route()裝飾器中的參數 函數
methods : 當前 url 地址,容許訪問的請求方式 url
@app.route("/info", methods=["GET", "POST"]) def student_info(): stu_id = int(request.args["id"]) return f"Hello Old boy {stu_id}" # Python3.6的新特性 f"{變量名}"
endpoint : 反向url地址,默認爲視圖函數名(url_for ) spa
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 Old boy {stu_id}" # Python3.6的新特性 f"{變量名}"
defaults : 視圖函數的參數默認值{"nid":1} debug
from flask import url_for @app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100}) def student_info(nid): print(url_for("r_info")) # /info # stu_id = int(request.args["id"]) print(nid) # 100 return f"Hello Old boy {nid}" # Python3.6的新特性 f"{變量名}"
strict_slashes :
url 地址結尾符 "/" 的控制.
False : 不管結尾 "/" 是否存在都可以訪問.
True : 結尾必須不能是 "/"
# 訪問地址 : /info @app.route("/info", strict_slashes=True) def student_info(): return "Hello Old boy info" # 訪問地址 : /infos or /infos/ @app.route("/infos", strict_slashes=False) def student_infos(): return "Hello Old boy infos"
redirect_to : url地址重定向
# 訪問地址 : /info 瀏覽器跳轉至 /infos @app.route("/info", strict_slashes=True, redirect_to="/infos") def student_info(): return "Hello Old boy info" @app.route("/infos", strict_slashes=False) def student_infos(): return "Hello Old boy infos"
subdomain
子域名前綴 subdomian="DragonFire" 這樣寫能夠獲得 DragonFire.oldboyedu.com 前提是app.config["SERVER_NAME"] = "oldboyedu.com"
app.config["SERVER_NAME"] = "oldboy.com" @app.route("/info",subdomain="DragonFire") def student_info(): return "Hello Old boy info" # 訪問地址爲: DragonFire.oldboy.com/info
2. 動態路由參數 :
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 Old boy {nid}" # Python3.6的新特性 f"{變量名}"
<int:nid> 就是在url後定義一個參數接收
可是這種動態參數路由,在url_for的時候,必定要將動態參數名+參數值添加進去,不然會拋出參數錯誤的異常
總結
1.endpoint #反向生成url地址標誌 默認視圖函數名 url_for 2.methods #視圖函數容許的請求方式 6."/index/<page>" 動態路由路由參數 def index(page) 3.defaults={"nid":"123456"} # 默認參數 4.strict_slashes=True #是否嚴格遵循路由地址 5.redirect_to="/login" #永久重定向 301