flask設置路由動態參數和重定向操作
路由動態參數
- 通過視圖函數綁定的url路徑來傳遞動態參數
- 獲取int類型動態參數,此時前端傳入的動態參數必須是int類型
此時運行flask服務,前端訪問@app.route("/param/<int:param>") def param_int(param): return f"<h1>傳入的int類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
http://127.0.0.1:5000/param/198
,前端展示爲傳入的int類型參數是:198,提示:傳入其他類型參數會報錯!
; - 獲取float類型動態參數,此時前端傳入的動態參數必須是float類型
此時運行flask服務,前端訪問@app.route("/param/<float:param>") def param_float(param): return f"<h1>傳入的float類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
http://127.0.0.1:5000/param/9.9
,前端展示爲傳入的float類型參數是:9.9,提示:傳入其他類型參數會報錯!
; - 獲取path路徑類型動態參數**(動態參數可以包含’/’)**,此時前端傳入的動態參數必須是path類型
此時運行flask服務,前端訪問@app.route("/param/<path:param>") def param_path(param): return f"<h1>傳入的path類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
http://127.0.0.1:5000/param/api/meta/translation
,前端展示爲傳入的path類型參數是:api/meta/translation,提示:傳入其他類型參數會報錯!
; - 獲取string類型動態參數**(動態參數不可以包含’/’)**,此時前端傳入的動態參數必須是string類型
此時運行flask服務,前端訪問@app.route("/param/<string:param>") def param_string(param): return f"<h1>傳入的string類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
http://127.0.0.1:5000/param/我叫小花花,今天21歲了
,前端展示爲傳入的string類型參數是:我叫小花花,今天21歲了,提示:傳入其他類型參數會報錯!
;
- 獲取int類型動態參數,此時前端傳入的動態參數必須是int類型
- 通過
request
來獲取前端url路徑使用?key1=value1&key2=value2
的形式來獲取傳入的動態參數。
此時運行flask服務,前端訪問@app.route("/hello") def say_hello(): name = request.args.get('name') age = request.args.get('age') return "<h1>hello " + name + ",你的年齡是" + age + "。</h1>"
http://127.0.0.1:5000/hello?name=小花花&age=21
,前端展示爲hello 小花花,你的年齡是21。
;訪問http://127.0.0.1:5000/hello?name=熊大&age=10
,前端展示爲hello 熊大,你的年齡是10。
。 - 補充知識:可以通過Python標準庫uuid來生成一個唯一ID。每次生成的
uuid
都是唯一的。import uuid print(uuid.uuid4()) # 4b994059-b244-44c8-ba7a-4282bb504f78 print(type(uuid.uuid4())) # <class 'uuid.UUID'>
flask路由自動重定向(瞭解即可,手動設置路由重定向纔是重點)
flask的哲學:/index/和/index是兩個不同的URLpath,不能搞混了。
代碼舉例說明/index/和/index是兩個不同的URLpath
#!/usr/bin/python3
# @FileName :flask_redirect.py
# @Time :2020/6/1 下午11:47
# @Author :ABC
# @Description :
from flask import Flask
app = Flask(__name__)
@app.route("/index")
def index():
return "這是`/index`頁面!"
if __name__ == '__main__':
app.run(debug=True)
此時訪問http://127.0.0.1:5000/index
, 前端頁面會展示這是index頁面!
。
然後在訪問http://127.0.0.1:5000/index/
,前端頁面會展示Not Found。The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
。
翻譯過來說的就是:找不到。在服務器上找不到請求的URL。如果您手動輸入網址,請檢查拼寫,然後重試。
這就說明了/index/和/index是兩個不同的URLpath,體現了flask的嚴謹哲學(手動狗頭~)
flask自動重定向示例
再看下邊的代碼
#!/usr/bin/python3
# @FileName :flask_redirect.py
# @Time :2020/6/1 下午11:47
# @Author :ABC
# @Description :
from flask import Flask
app = Flask(__name__)
@app.route("/index/")
def index():
return "這是index頁面!"
if __name__ == '__main__':
app.run(debug=True)
相比之前的代碼,現在的index()視圖函數綁定的路由的URLpath/index/
比之前的index()視圖函數綁定的路由的URLpath/index
多了一個/
斜槓。
此時我們再次訪問http://127.0.0.1:5000/index
,發現前端依然展示這是index頁面!
,說明響應成功了。
然後我們使用F12打開瀏覽器抓個包看一下。
我們可以看到一共抓到了兩個index
相關的請求包。
先看一下第一個/index
的請求包的響應狀態碼(Status Code)
和響應頭(Response Headers)
信息
可以看到接口響應狀態碼爲308
,也就是永久重定向(PERMANENT REDIRECT)
。
然後接着看/index
的響應體數據,發現沒有任何數據。
然後再接着看/index/
的響應狀態碼(Status Code)
爲200
。
/index/
的響應體數據纔是返回了我們定義的路由函數的返回值這是index頁面!
總結一下,當我們訪問http://127.0.0.1:5000/index
時,而我們實際的視圖函數index()
中路由綁定的URLpath是/index/
,但是flask程序最後依然通過308永久重定向
將請求由/index
重定向到/index/
了,這就體現了flask的靈活且對用戶友好的特點。
最後再來看一下flask自動重定向請求的整個過程。
路由註冊機制
那麼在flask中如何手動設置重定向呢,首先我們先來搞懂flask中的路由註冊機制
,順便總結一下在flask中註冊路由
的相關知識。
在flask中註冊路由
一共有2種方法
- 裝飾器註冊,也就是在
視圖函數
上使用裝飾器[@app.route("/index/")]
來綁定路由
,如:@app.route("/index/") def index(): return "這是index頁面!"
- 集中註冊路由,通過
app.add_url_rule()
來集中註冊路由,如:#!/usr/bin/python3 # @FileName :flask_redirect.py # @Time :2020/6/1 下午11:47 # @Author :ABC # @Description : from flask import Flask app = Flask(__name__) # @app.route("/index") # def index1(): # return "這是index頁面!" # @app.route("/index/") # def index(): # return "這是index頁面!" def hello(): return "hello" def say_name(): return "我叫小花花!" app.add_url_rule('/hello', hello) # endpoint設置爲`註冊路由的地址`,也就是`URLpath`;view_func設置爲視圖函數名稱,注意視圖函數名稱不能加`()`,只要函數名 app.add_url_rule(endpoint='/name', view_func=say_name) if __name__ == '__main__': app.run(debug=True)
總結一下,使用裝飾器註冊路由
主要適用於flask小型項目,使用app.add_url_rule(endpoint=XXX, view_func=XXX)
集中註冊路由主要適用於flask大型項目。
flask手動設置路由重定向
-
在裝飾器中使用
redirect_to=XXX
如:@app.route(redirect_to='/')
#!/usr/bin/python3 # @FileName :flask_manual_redirect.py # @Time :2020/6/3 上午12:24 # @Author :ABC # @Description : from flask import Flask app = Flask(__name__) @app.route("/") def home(): return "這是home首頁!" print(app.url_map) @app.route("/login", methods=['GET'], endpoint='user_login', redirect_to='/') # 在裝飾器中設置重定向,程序運行時不會執行當前視圖函數login() def login(): print('執行了login函數!') return "登錄成功!" if __name__ == '__main__': app.run(debug=True)
啓動flask服務,前端訪問
http://127.0.0.1:5000/login
,瀏覽器抓到的包如下抓到的第1個請求
抓到的第2個請求
可以看到請求已經從
/login
被重定向到/
了。同時控制檯也沒有打印login()
視圖函數中的print('執行了login函數!')
語句的內容,說明了在裝飾器中設置重定向,程序運行時不會執行當前視圖函數login()
-
通過
在視圖函數的return語句
中調用flask包中
的redirect()方法
來設置路由重定向#!/usr/bin/python3 # @FileName :flask_manual_redirect.py # @Time :2020/6/3 上午12:24 # @Author :ABC # @Description : from flask import Flask, redirect app = Flask(__name__) @app.route("/") def home(): return "這是home首頁!" print(app.url_map) # @app.route("/login", methods=['GET'], endpoint='user_login', redirect_to='/') # 在裝飾器中設置重定向,程序運行時不會執行當前視圖函數login() # def login(): # print('執行了login函數!') # return "登錄成功!" @app.route("/login", methods=['GET'], endpoint='user_login') def login(): print('執行了login函數!') return redirect('/') # 需要從flask包中導入`redirect`方法 print(app.url_map) if __name__ == '__main__': app.run(debug=True)
啓動flask服務,前端訪問
http://127.0.0.1:5000/login
,瀏覽器抓到的包如下抓到的第1個請求
抓到的第2個請求
可以看到請求已經從
/login
被重定向到/
了。同時控制檯也打印了login()
視圖函數中的print('執行了login函數!')
語句的內容,說明了在視圖函數的return語句
中調用flask包中
的redirect()方法
來設置路由重定向,依然會執行當前視圖函數login()的內容
好了,今天的內容就到這裏了。好累啊-.-