向运行 Gunicorn 的 Flask 应用程序添加路由前缀

Jus*_*tin 3 python flask gunicorn

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


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

当单独运行烧瓶时,有类似下面的东西
- (例如% 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)
Run Code Online (Sandbox Code Playgroud)

不知道在 Gunicorn 后面跑时如何获得相同的结果。
(真的很想在不为主应用程序制作蓝图的情况下做到这一点。还试图避免在 each 中使用相同的前缀@route(PREFIX + '')

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

这个问题是专门针对 Flask 提出的,我可以使用该DispatcherMiddleware方法进行工作。
我的问题是在 Gunicorn 后面运行时如何让它工作(前面没有 Nginx 或 Apache,只有 Gunicorn)


潜在的修复:

目前使用 Flask 的一个子类(需要做一些定制的日志废话。)
覆盖add_url_rule作品。

prefixed_rule = self._prefix_rule(rule)
super().add_url_rule(prefixed_rule,
                     endpoint=endpoint,
                     view_func=view_func,
                     **options)
Run Code Online (Sandbox Code Playgroud)

这也适用于我们的扩展

Sea*_*ira 5

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

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

  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)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 替换Flask.url_rule_class

    from werkzeug.routing import Rule
    
    app.url_rule_class = lambda path, **options: Rule(PREFIX + path, **options)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 替换add_url_rule,正如您在问题中所建议的那样。