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)
这也适用于我们的扩展
如果您正在做应用程序组合,那么您可以使用您引用的DispatcherMiddleware技巧。但是,听起来您正在尝试安装一个安装了子路径的服务,但根本不提供“更高”路径之外的任何服务。
有几种不同的方法可以做到这一点。
替换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)
Run Code Online (Sandbox Code Playgroud)from werkzeug.routing import Rule
app.url_rule_class = lambda path, **options: Rule(PREFIX + path, **options)
Run Code Online (Sandbox Code Playgroud)替换add_url_rule,正如您在问题中所建议的那样。
| 归档时间: |
|
| 查看次数: |
4185 次 |
| 最近记录: |