【发布时间】:2015-12-21 06:54:30
【问题描述】:
tldr; 寻找一种方法来为运行在 Gunicorn 后面的应用程序中的所有路由添加前缀,而无需在 @route(PREFIX + '/') 等中使用反向代理/蓝图/重复前缀。
使用 Flask 创建一些 Python 服务,在 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)
不确定如何在 Gunicorn 后面运行时获得相同的结果。
(真的很想在不为主应用程序制作蓝图的情况下执行此操作。同时尽量避免在每个 @987654326 中使用相同的前缀@)
这样做的原因
使用添加了一些路线的扩展以及蓝图。想要为所有应用程序路由和扩展/蓝图路由添加前缀。
This question 专门为 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)
这也适用于我们的扩展程序
【问题讨论】:
-
出于好奇,您在做什么需要将多个不可组合的服务视为一个站点?这是为了应用程序依赖隔离吗?为什么不在他们面前有一个反向代理呢?
-
只是针对一些微服务,所以会有一个端点。只是有一些需要作为前缀的扩展以及应用程序。我们目前有一个反向代理,但这可能会在未来发生变化,因此我们希望在路由级别执行此操作,如果/当它确实对我们发生变化时。