gpt4 book ai didi

python - Flask 开发服务器中静态文件的 URL 路由冲突

转载 作者:太空狗 更新时间:2023-10-29 21:13:50 28 4
gpt4 key购买 nike

我想定义一个包含三个变量组件的 url 规则,例如:

@app.route('/<var_1>/<var_2>/<var3>/')

但我发现开发服务器在尝试匹配静态文件之前会评估此类规则。所以像这样:

/static/images/img.jpg

将被我的 url 规则捕获,而不是被转发到内置的静态文件处理程序。有没有办法强制开发服务器先匹配静态文件?

附言仅当规则具有两个以上的可变组件时才会出现问题。

最佳答案

这是 werkzeug 路由优化功能。参见 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 - 路径深度。

对于 '/<var_1>/<var_2>/<var3>/'我们有(True, -3, [(1, 100), (1, 100), (1, 100)]) .有(1, 100) - 最大长度为 100 的默认字符串参数。

对于 '/static/<path:filename>'我们有(True, -2, [(0, -6), (1, 200)]) .有(0, 1) - 路径非参数字符串长度 static , (1, 200) - 路径字符串参数最大长度为 200。

所以我没有找到任何漂亮的方法来设置自己的Map Flask.url_map 的实现或为映​​射规则设置优先级。解决方案:

  1. 设置 Flask申请为app = Flask(static_path='static', static_url_path='/more/then/your/max/variables/path/depth/static') .
  2. 更改 @app.route('/<var_1>/<var_2>/<var3>/')@app.route('/prefix/<var_1>/<var_2>/<var3>/') .
  3. 添加自己的转换器并用作@app.route('/<no_static:var_1>/<var_2>/<var3>/') .
  4. 进口 werkzeug.routing ,创建自己的 map 实现,更改 werkzeug.routing.Map自己实现,导入 flask .
  5. 在生产环境中使用服务器。

关于python - Flask 开发服务器中静态文件的 URL 路由冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17135006/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com