首頁>技術>

本文內容:

路由轉換器的進階使用

自定義轉換器

在上篇文章中我們也簡單說了一下如何自定義轉換器,我把程式碼重新弄過來:

# -*- coding: utf-8 -*-from flask import Flaskfrom werkzeug.routing import BaseConverterapp = Flask(__name__)# 1.定義自己的轉換器class RegexConverte(BaseConverter): def __init__(self, url_map, regex): # 呼叫父類的初始化方法 super(RegexConverte, self).__init__(url_map) # 將正則表示式的引數儲存在物件的屬性中,flask會去使用這個屬性來進行路由的正則匹配 self.regex = regex# 2. 將自定義的轉換器新增到flask的應用中app.url_map.converters["re"] = RegexConverte@app.route("/send/<re(r'1[345678]\\d{9}'):moblie>")def send_sms(moblie): return "send_sms: %s" % moblieif __name__ == '__main__': # 啟動flask程式 app.run(debug=True)

大家可能看著一個例子會有點懵,這裡我再寫一個比較具體的例子給大家,這次的例子還是提取電話號碼 :

# -*- coding: utf-8 -*-from flask import Flaskfrom werkzeug.routing import BaseConverterapp = Flask(__name__)class MobileConverte(BaseConverter): def __init__(self,url_map): # 呼叫父類的初始化方法 super(MobileConverte, self).__init__(url_map) self.regex = r'1[345678]\\d{9}'# 2. 將自定義的轉換器新增到flask的應用中app.url_map.converters["mobile"] = MobileConverte@app.route("<mobile:moblie_num>")def send_sms(moblie_num): return "send_sms: %s" % moblie_numif __name__ == '__main__': # 啟動flask程式 app.run(debug=True)

大家會注意到在第10行,self.regex = r'1[345678]\\d{9}' ,這句話其實就是我們整個功能的核心,在上一個例子中,我們是需要自己去定義正則表示式的,而這個例子只能實現提取電話號碼這一個功能。

to_python方法

大家在自定義轉換器時可能會發現我們需要建立一個類,然後我們初始化這個類。

按照這種寫法一般不僅僅只是寫了個__init__方法就可以實現轉換器,而是這個類中還有其他的方法。

我們可以看到我們所繼承的父類BaseConverter中,有to_python和to_url兩個方法,我們首先來看看to_python方法。

其實to_python這個方法才是轉換器的核心,當我們轉換器提取到路徑上面的引數後,不是直接返回給檢視函式中的引數,而是要經過to_python方法才返回給檢視函式,我給大家畫了張圖可能更容易理解:

怎麼驗證這個說法呢?我給大家舉個例子:

大家可以看到我把to_python方法的返回值給改成了123456,我們執行一下看看它是返回“123456”還是返回路徑中所提取的引數

可以看到無論我在位址列上輸入什麼,返回都是123456

那麼有人會問這個方法有些什麼用呢?

當然是有很大用處的,就拿我們提取手機號碼引數舉例,如果我們只希望使用者提交的是133開頭的手機號,我們就可以在to_python這個方法裡面去進行操作。

to_url方法

除了to_python方法,這個方法有什麼用呢?其實to_url方法和我們之前講的url_for方法有著很大的聯絡,我們可以看下下面的程式碼:

# -*- coding: utf-8 -*-from flask import Flask,redirect,url_forfrom werkzeug.routing import BaseConverterapp = Flask(__name__)class MobileConverte(BaseConverter): def __init__(self,url_map): # 呼叫父類的初始化方法 super(MobileConverte, self).__init__(url_map) self.regex = r'1[345678]\\d{9}' def to_python(self, value): return "123456"# 2. 將自定義的轉換器新增到flask的應用中# app.url_map.converters["re"] = RegexConverteapp.url_map.converters["mobile"] = MobileConverte# http://127.0.0.1:5000/send/15123451234@app.route("/send/<mobile:moblie_num>")def send_sms(moblie_num): return "send_sms: %s" % moblie_num@app.route("/index")def index(): url = url_for("send_sms", moblie_num="1892231312") return redirect(url)if __name__ == '__main__': # 啟動flask程式 app.run(debug=True)

我們主要看:

@app.route("/index")def index(): url = url_for("send_sms", moblie_num="1892231312") return redirect(url)

可以看到我們url_for裡面有兩個引數,第一則是指向我們send_sms檢視函式的,後面那個則是send_sms函式中所提取電話號碼的值。通過這樣傳值我們就可以通過url_for來呼叫一些有變化的引數的檢視函式。

其實和to_python方法一樣,每次進行url_for提交的引數都會先經過to_url,經過處理後才會返回回去。這裡我就不過多演示。

80

Flask

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Google Analytics 的一些用法介紹