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

时间:2015-09-23 19:51:12

标签: python flask gunicorn

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

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

在下面运行烧瓶时有类似的东西   - (例如% python app.py以[{1}})

回复
localhost:5000/a/b/some-route

在Gunicorn后面跑步时,不确定如何达到相同的效果 (真的很想在没有为主应用程序制作蓝图的情况下这样做。还要尽量避免在每个base_path = "/a/b" app = DispatcherMiddleware(_root_app, {base_path: self}) run_simple(host, port, app, **options) 中使用相同的前缀

这样做的原因
使用添加了一些路径的扩展以及蓝图。希望将app路由和扩展/蓝图路由都加上前缀。

  

This question专门问Flask,我可以使用@route(PREFIX + '')方法开始工作。
  我的问题是如何在Gunicorn背后运行时(前面没有Nginx或Apache,只有Gunicorn)

潜在修复:

目前使用Flask 的子类(需要做一些自定义的日志记录废话。)
覆盖DispatcherMiddleware有效。

add_url_rule

这也适用于我们的扩展程序

3 个答案:

答案 0 :(得分:2)

如果您正在进行应用合成,那么您可以使用您引用的DispatcherMiddleware trick。但是,听起来您正在尝试使用单个服务进行子路径安装,但不能提供任何超出"更高级别的服务。路径。

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

  1. 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)
    
  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

答案 1 :(得分:0)

您可以为特定蓝图的所有路线添加前缀

from flask import Blueprint
my_blueprint = Blueprint('my_blueprint_name', __name__, url_prefix='/my_prefix')

然后为你的所有蓝图路线简单地放

@my_blueprint.route('my_route')

在函数定义及其路由之前将是url_prefix + my_route

您可能会发现此链接有用http://flask.pocoo.org/docs/0.10/patterns/urlprocessors/

答案 2 :(得分:0)

尝试

app = dash.Dash(
    __name__,
    server=server,
    routes_pathname_prefix='/dash/'
)