Flask路由規則都是基於Werkzeug的路由模塊的,它還提供了不少強大的功能。css
兩種添加路由的方式html
方式一: @app.route('/xxxx') # @decorator def index(): return "Index" 方式二: def index(): return "Index" app.add_url_rule('/xxx', "n1", index) #n1是別名
@app.route和app.add_url_rule參數: rule, URL規則 view_func, 視圖函數名稱 defaults=None, 默認值,當URL中無參數,函數須要參數時,使用defaults={'k':'v'}爲函數提供參數 endpoint=None, 名稱,用於反向生成URL,即: url_for('名稱') methods=None, 容許的請求方式,如:["GET","POST"] strict_slashes=None, 對URL最後的 / 符號是否嚴格要求, 如: @app.route('/index',strict_slashes=False), 訪問 http://www.xx.com/index/ 或 http://www.xx.com/index都可 @app.route('/index',strict_slashes=True) 僅訪問 http://www.xx.com/index redirect_to=None, 重定向到指定地址 如: @app.route('/index/<int:nid>', redirect_to='/home/<nid>') 或 def func(adapter, nid): return "/home/888" @app.route('/index/<int:nid>', redirect_to=func)
舉例使用python
# ============對url最後的/符號是否嚴格要求========= @app.route('/test',strict_slashes=True) #當爲True時,url後面必須不加斜槓 def test(): return "aaa" @app.route('/test',strict_slashes=False) #當爲False時,url上加不加斜槓都行 def test(): return "aaa" @app.route("/json_test/<int:age>" ,defaults={'age':66}) def json_test(age): ret_dic = {'name': 'xiaowang', 'age': age} return jsonify(ret_dic) # 轉換json形式
@app.route('/hello/<name>') def hello(name): return 'Hello %s' % name @app.route('/hello/<name>_<age>_<sex>') # 多個參數 def hello(name,age,sex): return 'Hello %s,%s,%s' %(name,age,sex)
在瀏覽器的地址欄中輸入http://localhost:5000/hello/Joh
,你將在頁面上看到」Hello Joh」的字樣。json
URL路徑中/hello/
後面的參數被做爲hello()
函數的name
參數傳了進來。瀏覽器
多個參數session
# 動態路由參數 @app.route("/json_param/<int:age>" ,strict_slashes=False) def json_param(age): ret_dic = {'name': 'xiaowang', 'age': age} return jsonify(ret_dic)
當請求傳來一個url的時候,會先經過rule找到endpoint(url_map),而後再根據endpoint再找到對應的view_func(view_functions)。一般,endpoint的名字都和視圖函數名同樣。
實際上這個endpoint就是一個Identifier,每一個視圖函數都有一個endpoint,
當有請求來到的時候,用它來知道到底使用哪個視圖函數
endpoint能夠解決視圖函數重名的狀況
Flask中裝飾器屢次使用
# 驗證用戶裝飾器 def wrapper(func): @wraps(func) def inner(*args, **kwargs): if not session.get("user_info"): return redirect("/login") ret = func(*args, **kwargs) return ret return inner @app.route("/login", methods=("GET", "POST")) def login(): # 模板渲染 # print(request.path) # print(request.url) # print(request.headers) if request.method == "GET": print(request.args.get("id")) text_tag = "<p>你看見了嗎test:<input type='text' name='test'></p>" text_tag = Markup(text_tag) return render_template("login.html", msg=text_tag) # sum = add_sum) else: # print(request.form) # print(request.values.to_dict()) # 這個裏面什麼都有,至關於body # print(request.json) # application/json # print(request.data) username = request.form.get("username") password = request.form.get("password") if username == "alex" and password == "123": session["user_info"] = username # session.pop("user_info") #刪除session return "登陸成功" else: return render_template("login.html", msg="用戶名或者密碼錯誤") # endpoint能夠解決視圖函數重名的狀況 @app.route("/detail", endpoint="detail") @wrapper # f = route(wrapper(detail)) def detail(): print(url_for("detail")) return render_template("detail.html", **STUDENT) @app.route("/detail_list", endpoint="detail_list") @wrapper # f = route(wrapper(detail_list)) def detail_list(): return render_template("detail_list.html", stu_list=STUDENT_LIST) @app.route("/detail_dict") def detail_dict(): if not session.get("user_info"): return redirect("/login") return render_template("detail_dict.html", stu_dict=STUDENT_DICT)
反向生成URL: url_forapp
endpoint("name") #別名函數
@app.route('/index',endpoint="xxx") #endpoint是別名 def index(): v = url_for("xxx") print(v) return "index"
一個Web應用的靜態文件包括了JS, CSS, 圖片等,Flask的風格是將全部靜態文件放在」static」子目錄下。而且在代碼或模板中,使用url_for('static')來獲取靜態文件目錄 app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx') <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}"> <div class="page"> {% block body %} {% endblock %} </div>
@app.route("/bo") def bo(): # return render_template("bo.html") return send_file("s1.py") # 發送文件(能夠是圖像或聲音文件) @app.route("/json_test/<int:age>" ,defaults={'age':66}) def json_test(age): ret_dic = {'name': 'xiaowang', 'age': age} return jsonify(ret_dic) # 轉換json形式,幫助轉換爲json字符串, 而且設置響應頭Content-Type: application/json