当前位置: 首页 > 面试题库 >

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

景帅
2023-03-14
问题内容

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

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

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

/static/images/img.jpg

会被我的url规则捕获,而不是转发给内置的静态文件处理程序。有没有一种方法可以强制开发服务器首先匹配静态文件?

PS仅当规则具有两个以上可变组成部分时,这才是问题。


问题答案:

这是werkzeug路线优化功能。见Map.addMap.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,创建自己的地图实现,更改werkzeug.routing.Map为自己的实现,导入flask
  5. 在生产环境中使用服务器。


 类似资料:
  • 问题内容: 我正在制作一个简单的音乐应用。我想允许用户上传他们的音频文件,并且我有一个页面打算显示所有歌曲。我创建了一个模板,其结构如下所示: 在这里,我想创建一个动态路径来覆盖图像和记录,但是我不知道在这里正确地将路径写入文件: 请说明如何做。我试图在flask网站页面上找到解决方案,但是目前我没有任何结果。 问题答案: 我不认为你可以嵌套这样的模板标签。但是你也不必这样做。 你可以从以下示例中

  • 问题内容: 有没有一种简单的方法可以关闭Django开发服务器中的静态文件缓存? 我正在使用标准命令启动服务器: 我已配置为从Django项目的目录提供静态文件。我还有一个中间件类,该类将标头设置为开发用,但是这似乎只会影响不在目录中的URL 。 问题答案: 假设您正在使用,它看起来并不像- 但是编写自己的仅调用视图,添加Cache-Control标头应该非常容易。

  • 问题内容: 我想像通常那样处理静态文件,但像通常那样处理动态路由 其中一位开发人员在此评论中提出了解决方案,但我不清楚他的意思。 问题答案: 好的。我在Express的response object 的源代码中找到了一个示例。这是该示例的稍作修改的版本。 它使用该方法。 注意 :安全性更改要求使用此选项。

  • 问题内容: 这个问题已经被回答了好几次了,我已经看到了几乎所有相关的帖子,但是无法加载CSS文件。我在我的项目中有以下结构:中,我有以下代码: 在urls.py中,我有以下代码: 我在模板中使用它 我在做什么错?我应该做什么?例如应该在中添加任何内容?或在的设置中?请假设我是一个绝对的初学者。我真的需要一个答案。谢谢。 问题答案: 什么都不做的装饰器类如下所示: 然后您可以正常应用它:

  • 问题内容: 我在Google App Engine上使用了第三方路由器(httprouter),并且希望从根目录提供静态文件。 由于使用了App Engine,我需要将第三方路由器附加到on : 问题是,这会重复模式和出现“ /多个注册 ”的紧急情况 如何提供文件( 尤其是从根目录访问文件)并使用第三方路由器? 问题答案: 如果您在提供静态文件,则无法按照https://github.com/ju

  • 我们先来看看最简单的本地静态文件服务配置示例: server { listen 80; server_name www.test.com; charset utf-8; root /data/www.test.com; index index.html index.htm; } 就这些?