flask跟web.py差別挺大的,尤其是在路由管理這塊。web.py把所有的路由都集中在一起,我比較喜歡這種方式。最近用flask,發現@app.route('<URL>')中URL只支持string、int、float、path 4種類型,并不支持正則。
2 回答

當年話下
TA貢獻1890條經驗 獲得超9個贊
通過運行如下代碼:
from flask import Flaskfrom pprint import pprintif __name__ == '__main__': app = Flask(__name__) pprint(app.url_map.converters)
可以獲取Flask默認支持的轉換器:
{'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'>}
那如何創建一個新的路由解析轉化器呢?
在Flask的app.py里有個簡單的例子,這個例子是創建了一個list類型的路由轉換器:
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
那么我們可以容易創建一個正則解析器,因為之前的轉換器最終也是轉換成正則的,只需要將獲取的值設置為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'] = [email protected]('/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)

犯罪嫌疑人X
TA貢獻2080條經驗 獲得超4個贊
插一句,flask也可以集中到一起。
python的裝飾器其實就是返回函數的函數,外層函數的參數就是裝飾器的參數,內層函數的參數是被裝飾的函數。所以直接調用app.route
應該會返回一個函數,直接把req handler傳進去就可以注冊它。
于是,你可以這樣寫:
app.route(pattern)(handler)
就能集中到一起了。
- 2 回答
- 0 關注
- 205 瀏覽
添加回答
舉報
0/150
提交
取消