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

标签 python flask gunicorn

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/

相关文章:

python - class_weights 如何应用于 sklearn 逻辑回归?

python在字符串中求解方程

python - jinja2 设置背景图像

基于 grunt 的工作流程的 Flask 项目结构

python - Flask-security 无法与具有多个工作人员的 Gunicorn 一起使用吗?

python - Gunicorn导入错误: No module named app

python - Django Modal save() 函数未实现,使用 google app engine dev server 和 mysql

python - 如何从具有嵌套列表的列表中递归删除元素?

javascript - 自动完成搜索框并将值传递给 flask

django - 无法启动 gunicorn.service : Unit gunicorn. 找不到服务