gpt4 book ai didi

python - 将路由前缀添加到在 Gunicorn 上运行的 Flask 应用程序

转载 作者:行者123 更新时间:2023-11-30 23:06:13 31 4
gpt4 key购买 nike

tldr; 寻找一种方法,为在 Gunicorn 后面运行的应用程序中的所有路由添加前缀,而无需在 @route(PREFIX + '/') 中使用反向代理/蓝图/重复前缀

<小时/>

使用 Flask 创建一些 Python 服务,在 Docker 容器中运行。
目前,还没有使用 Nginx/Apache 进行反向代理。

像下面这样的东西在单独运行 Flask 时可以工作
- (例如 % python app.py 响应 localhost:5000/a/b/some-route)

base_path = "/a/b"
app = DispatcherMiddleware(_root_app, {base_path: self})
run_simple(host, port, app, **options)

不知道如何在 Gunicorn 后面运行时达到相同的结果。
(真的很想在不为主应用程序制作蓝图的情况下执行此操作。同时尝试避免在每个 @route(PREFIX + '') 中使用相同的前缀)

这样做的原因
使用添加一些路线的扩展以及蓝图。希望应用程序路由和扩展/蓝图路由都带有前缀。

This question asked this specifically for Flask, which I'm able to get working using the DispatcherMiddleware approach.
My question is how to get this working when running behind Gunicorn (no Nginx or Apache in front, just Gunicorn)

<小时/>

潜在修复:

当前使用 Flask 的子类(需要做一些自定义的日志记录。)
覆盖 add_url_rule 有效。

prefixed_rule = self._prefix_rule(rule)
super().add_url_rule(prefixed_rule,
endpoint=endpoint,
view_func=view_func,
**options)

这也适用于我们的扩展

最佳答案

如果您正在进行应用程序组合,那么您可以使用DispatcherMiddleware trick你引用了。但是,听起来您正在尝试安装一个子路径服务,但根本不提供“更高”路径之外的任何服务。

有几种不同的方法可以做到这一点。

  1. 替换Flask.url_map._ruleswerkzeug.routing.Submount规则工厂:

    from werkzeug.routing import SubPath

    app = Flask(__name__)

    # register blueprints and extensions
    # load config, etc.

    app.url_map._rules = SubPath(app.config['APPLICATION_ROOT'], app.url_map._rules)
  2. 替换Flask.url_rule_class :

    from werkzeug.routing import Rule

    app.url_rule_class = lambda path, **options: Rule(PREFIX + path, **options)
  3. 按照您在问题中的建议替换 add_url_rule

关于python - 将路由前缀添加到在 Gunicorn 上运行的 Flask 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32748326/

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