使用DispatcherMiddleware的wsgi_app Flask应用程序的URL

时间:2016-10-08 22:42:13

标签: python flask wsgi

我有两个应用程序工厂函数 - 一个创建“客户”应用程序,另一个创建“管理员”后端应用程序。两个工厂函数基本上都执行了所描述的here - 创建一个烧瓶应用程序并为其注册一些扩展,然后添加一些蓝图(带有url_prefix)。我通过下面的create_combined_app()将两个应用程序粘合在一起。它是我在Flask-Script的Manager注册的函数的返回值。

def create_combined_app(config_name):
    customer_app = create_customer_app(config_name)
    admin_app = create_admin_app(config_name)

    from werkzeug.wsgi import DispatcherMiddleware

    customer_app.wsgi_app = DispatcherMiddleware(customer_app.wsgi_app, {
        '/admin': admin_app
    })

    return customer_app

然后我就是这样做的。

def make_me_an_app():
    return create_combined_app(config)

manager = Manager(make_me_an_app)
...

if __name__ == '__main__':
    manager.run()

我想做一些测试,包括获取我的应用的所有GET路线并确保它们加载。我按照here中的示例进行了操作,但我只看到客户应用的网址,而且 admin 后端的网址都没有。

@main.route("/site-map")
def site_map():
    from flask import current_app, jsonify
    links = []
    app = current_app
    for rule in app.url_map.iter_rules():
        if "GET" in rule.methods and has_no_empty_params(rule):
            url = url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    return jsonify(links)

当我尝试从浏览器访问它时,管理员后端工作 - 这一切都很好用,除了我在调用/ site-map时没有看到管理员的网址。

谢谢! :)

1 个答案:

答案 0 :(得分:0)

我认为 DispatcherMiddleware 会创建单独的应用。这意味着您创建了customer_app和admin_app。那些2独立生活。他们不认识对方,因此current_app只是show customer_app。

以下是Flask http://flask.pocoo.org/docs/0.12/patterns/appdispatch/

的描述

enter image description here