我想定义一个包含三个变量组件的url规则,例如:
@app.route('/<var_1>/<var_2>/<var3>/')
但是我发现开发服务器在尝试匹配静态文件之前会评估这些规则。所以像这样:
/static/images/img.jpg
会被我的url规则捕获,而不是转发给内置的静态文件处理程序。有没有一种方法可以强制开发服务器首先匹配静态文件?
PS仅当规则具有两个以上可变组成部分时,这才是问题。
这是werkzeug路线优化功能。见Map.add,Map.update并且Rule.match_compare_key:
Map.add
Map.update
Rule.match_compare_key
def match_compare_key(self): """The match compare key for sorting. Current implementation: 1. rules without any arguments come first for performance reasons only as we expect them to match faster and some common ones usually don't have any arguments (index pages etc.) 2. The more complex rules come first so the second argument is the negative length of the number of weights. 3. lastly we order by the actual weights. :internal: """ return bool(self.arguments), -len(self._weights), self._weights
有self.arguments-当前参数self._weights-路径深度。
self.arguments
self._weights
因为'/<var_1>/<var_2>/<var3>/'我们有(True, -3, [(1, 100), (1, 100), (1, 100)])。有(1, 100)-最大长度为100的默认字符串参数。
'/<var_1>/<var_2>/<var3>/'
(True, -3, [(1, 100), (1, 100), (1, 100)])
(1, 100)
因为'/static/<path:filename>'我们有(True, -2, [(0, -6), (1, 200)])。有(0, 1)-路径非参数字符串长度static,(1, 200)-路径字符串参数最大长度200。
'/static/<path:filename>'
(True, -2, [(0, -6), (1, 200)])
(0, 1)
static
(1, 200)
因此,我找不到任何精美的方法来设置自己的Map实现Flask.url_map或为地图规则设置优先级。解决方案:
Map
Flask.url_map
Flask
app = Flask(static_path='static', static_url_path='/more/then/your/max/variables/path/depth/static')
@app.route('/prefix/<var_1>/<var_2>/<var3>/')
@app.route('/<no_static:var_1>/<var_2>/<var3>/')
werkzeug.routing
werkzeug.routing.Map
flask