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你引用了。但是,听起来您正在尝试安装一个子路径服务,但根本不提供“更高”路径之外的任何服务。
有几种不同的方法可以做到这一点。
替换
Flask.url_map._rules
与werkzeug.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)
-
from werkzeug.routing import Rule app.url_rule_class = lambda path, **options: Rule(PREFIX + path, **options)
按照您在问题中的建议替换
add_url_rule
。
关于python - 将路由前缀添加到在 Gunicorn 上运行的 Flask 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32748326/