原創(chuàng): JAP君 JAVAandPython君
本文內容:
路由轉換器的進階使用
自定義轉換器
在上篇文章中我們也簡單說了一下如何自定義轉換器,我把代碼重新弄過來:
# -*- coding: utf-8 -*-
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1.定義自己的轉換器
class RegexConverte(BaseConverter):
def __init__(self, url_map, regex):
# 調用父類的初始化方法
super(RegexConverte, self).__init__(url_map)
# 將正則表達式的參數(shù)保存在對象的屬性中,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" % moblie
if __name__ == '__main__':
# 啟動flask程序
app.run(debug=True)
大家可能看著一個例子會有點懵,這里我再寫一個比較具體的例子給大家,這次的例子還是提取電話號碼 :
# -*- coding: utf-8 -*-
from flask import Flask
from werkzeug.routing import BaseConverter
app = 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_num
if __name__ == '__main__':
# 啟動flask程序
app.run(debug=True)
大家會注意到在第10行,self.regex = r'1[345678]\d{9}' ,這句話其實就是我們整個功能的核心,在上一個例子中,我們是需要自己去定義正則表達式的,而這個例子只能實現(xiàn)提取電話號碼這一個功能。
to_python方法
大家在自定義轉換器時可能會發(fā)現(xiàn)我們需要創(chuàng)建一個類,然后我們初始化這個類。
按照這種寫法一般不僅僅只是寫了個__init__方法就可以實現(xiàn)轉換器,而是這個類中還有其他的方法。
我們可以看到我們所繼承的父類BaseConverter中,有to_python和to_url兩個方法,我們首先來看看to_python方法。
其實to_python這個方法才是轉換器的核心,當我們轉換器提取到路徑上面的參數(shù)后,不是直接返回給視圖函數(shù)中的參數(shù),而是要經過to_python方法才返回給視圖函數(shù),我給大家畫了張圖可能更容易理解:
怎么驗證這個說法呢?我給大家舉個例子:
大家可以看到我把to_python方法的返回值給改成了123456,我們運行一下看看它是返回“123456”還是返回路徑中所提取的參數(shù)
可以看到無論我在地址欄上輸入什么,返回都是123456
那么有人會問這個方法有些什么用呢?
當然是有很大用處的,就拿我們提取手機號碼參數(shù)舉例,如果我們只希望用戶提交的是133開頭的手機號,我們就可以在to_python這個方法里面去進行操作。
to_url方法
除了to_python方法,這個方法有什么用呢?其實to_url方法和我們之前講的url_for方法有著很大的聯(lián)系,我們可以看下下面的代碼:
# -*- coding: utf-8 -*-
from flask import Flask,redirect,url_for
from werkzeug.routing import BaseConverter
app = 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"] = RegexConverte
app.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里面有兩個參數(shù),第一則是指向我們send_sms視圖函數(shù)的,后面那個則是send_sms函數(shù)中所提取電話號碼的值。通過這樣傳值我們就可以通過url_for來調用一些有變化的參數(shù)的視圖函數(shù)。
其實和to_python方法一樣,每次進行url_for提交的參數(shù)都會先經過to_url,經過處理后才會返回回去。這里我就不過多演示。