2 回答

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
通過運(yùn)行如下代碼:
from flask import Flaskfrom pprint import pprintif __name__ == '__main__': app = Flask(__name__) pprint(app.url_map.converters)
可以獲取Flask默認(rèn)支持的轉(zhuǎn)換器:
{'any': <class 'werkzeug.routing.AnyConverter'>, 'default': <class 'werkzeug.routing.UnicodeConverter'>, 'float': <class 'werkzeug.routing.FloatConverter'>, 'int': <class 'werkzeug.routing.IntegerConverter'>, 'path': <class 'werkzeug.routing.PathConverter'>, 'string': <class 'werkzeug.routing.UnicodeConverter'>}
那如何創(chuàng)建一個(gè)新的路由解析轉(zhuǎn)化器呢?
在Flask的app.py里有個(gè)簡單的例子,這個(gè)例子是創(chuàng)建了一個(gè)list類型的路由轉(zhuǎn)換器:
from werkzeug.routing import BaseConverter class ListConverter(BaseConverter): def to_python(self, value): return value.split(',') def to_url(self, values): return ','.join(BaseConverter.to_url(value) for value in values) app = Flask(__name__) app.url_map.converters['list'] = ListConverter
那么我們可以容易創(chuàng)建一個(gè)正則解析器,因?yàn)橹暗霓D(zhuǎn)換器最終也是轉(zhuǎn)換成正則的,只需要將獲取的值設(shè)置為regex屬性就可以使用了:
from flask import Flaskfrom werkzeug.routing import BaseConverterclass RegexConverter(BaseConverter): def __init__(self, map, *args): self.map = map self.regex = args[0] app = Flask(__name__) app.url_map.converters['regex'] = RegexConverter@app.route('/view/<regex("[a-zA-Z0-9]+"):uuid>/')def view(uuid): """ url: /view/1010000000125259/ result: view uuid:1010000000125259 """ return "view uuid: %s" % (uuid)@app.route('/<regex(".*"):url>')def not_found(url): """ url: /hello result: not found: 'hello' """ return "not found: '%s'" % (url)

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
插一句,flask也可以集中到一起。
python的裝飾器其實(shí)就是返回函數(shù)的函數(shù),外層函數(shù)的參數(shù)就是裝飾器的參數(shù),內(nèi)層函數(shù)的參數(shù)是被裝飾的函數(shù)。所以直接調(diào)用app.route
應(yīng)該會(huì)返回一個(gè)函數(shù),直接把req handler傳進(jìn)去就可以注冊(cè)它。
于是,你可以這樣寫:
app.route(pattern)(handler)
就能集中到一起了。
- 2 回答
- 0 關(guān)注
- 199 瀏覽
添加回答
舉報(bào)