flask框架自定義url轉換器操作詳解
阿新 • • 發佈:2020-01-31
本文例項講述了flask框架自定義url轉換器。分享給大家供大家參考,具體如下:
什麼是url轉換器
可以指定url的規制,對url做一定的限制。
自帶的url轉換器
可以參考我的上一篇部落格: flask–url與重定向詳解
自定義url轉換器
首先我們提一個需求,根據需求來寫程式碼,現在我們假設一個url需要滿足電話號碼的格式才能訪問我們的函式檢視,例如這樣的url: 127.0.0.1:5000/user/<電話號碼>/.
# 首先匯入BaseConverter from werkzeug.routing import BaseConverter from flask import Flask app = Flask(__name__) # 然後我們寫一個類,需要繼承BaseConverter這個類 class TelphoneConverter(BaseConverter): # 然後將我們url的規則寫到regex這個屬性上,必須為regex,正則表示式 # 以1開始,第二位數只能是3458中的一個,然後後面隨便跟9個數字 regex = '1[3458]\d{9}' # 然後我們需要註冊我們自定義的轉換器 # 'tel': 為我們給這個轉換器取的名字,我們使用的時候就會使用這個名字 # 'TelephoneConverter': 為'tel'這個轉換器對應的類,也就是我們上面寫的類,當我們使用'tel'時,就會去使用這個類中的regex屬性 app.url_map.converters['tel'] = TelephoneConverter # 然後使用我們的tel轉換器 @app.route('/user/<tel:telephone>') def tel_demo(telephone): return "你的電話號碼是:%s" % telephone
然後我們就可以輸入網址測試了,如果我們輸入的規則不滿足我們寫的正則表示式的話,就會出現404頁面。
在上面的tel轉換器中,我們只是寫了規則,我們還可以對url進行一些自定義的處理,然後再傳給我們的檢視函式.
這個時候就會使用到我們的to_python和to_url方法了
需求:當輸入的url為127.0.0.1/a+b/這樣的時候,我們想在檢視函式中拿到的時候就直接是一個列表['a','b'],而不用我們每次都去自己轉換。而當我們使用url_for闖入引數的時候,我們直接傳入['a',也能直接給我們變成a+b這種形式。
程式碼如下:
from flask import Flask from flask import url_for from werkzeug.routing import BaseConverter class ListConverter(BaseConverter): # 重寫to_python方法,value就是url傳入的引數,也就是我們url中傳入的引數會經過這個方法處理之後, # 然後再返回給我們的檢視函式,也就是我們在檢視函式中拿到的值是經過這個函式處理過後的值 def to_python(self,value): return value.split('+') # 重寫to_url方法,value就是我們在使用url_for的時候傳入的引數,也就是說我們傳入的引數會經過這個方法的處理,再變成url def to_url(self,value): return "+".join(value) # 然後我們還是要註冊我們的轉換器 app.url_map.converters['list'] = ListConverter # 然後編寫一個檢視來測試 @app.route('/index/') def index(): return url_for('board',boards=['a','b']) @app.route('/<list:boards>/') def demo(boards): print(boards) return 'boards is ' + str(boards)
然後啟動專案,當我們訪問127.0.0.1:5000/index/的時候,我們就能看到/a+b/,這個就是to_url函式起作用了。而當我們在瀏覽中輸入127.0.01:5000/a+b/,就能看到了一個列表。這也就是我們的to_python起作用了。
總結:
- 自定義url轉換器需要繼承自BaseConverter這個類
- url的規則需要重寫regex這個屬性(寫正則表示式)
- to_python方法是在url中的引數傳入檢視函式之前,會對引數進行處理
- to_url方法在使用url_for的時候,會對傳入的引數進行處理,再轉化為url
- 最後,一定要將自定義的url轉換器新增至app.url_map.converters中
希望本文所述對大家基於flask框架的Python程式設計有所幫助。