使用DispatcherMiddleware实例组合2个Flask应用程序会导致404用于第二个应用程序

时间:2016-05-15 16:56:47

标签: python flask

对于含糊不清的问题我很抱歉,我不确定我能把它变得更好。所以让我解释一下我的问题。

我有Flask应用程序libindic,它有2个Flask应用程序,一个是前端,另一个是api。所以我的wsgi.py如下

from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware

from silpa import api, frontend
import os

conffile = os.path.join(os.path.dirname(__file__), "etc", "silpa.conf")

application = DispatcherMiddleware(frontend.create_app(conffile),
                                   {'/api': api.create_app(conffile)})

if __name__ == "__main__":
    run_simple('0.0.0.0', 5000, application,
use_reloader=True, use_debugger=True)

前端访问正常,但是当我点击/ api / JSONRPC时,我收到了404错误。此规则在silpa / api / jsonrpc.py

中定义如下
bp = Blueprint('api_jsonrpc', __name__, url_prefix='/api')


@route(bp, '/JSONRPC', methods=['POST'])
def handle_jsonrpc_call():
    ...

当我在python解释器中打印应用程序和application.app以及application.mounts的值时,我会看到以下内容

>>> application.app
<Flask 'silpa.frontend'>
>>> application.mounts
{'/api': <Flask 'silpa.api'>}

我无法弄清楚为什么/ api / JSONRPC导致404.我不知道如何调试它。我确实检查了api应用程序的app.url_map,我可以在那里看到/ api / JSONRPC的规则。

如果有人可以告诉我我可能做错了什么,那将是一个很大的帮助。

1 个答案:

答案 0 :(得分:1)

确定调试并单步执行Flask代码后,我找出了问题的原因。以下行实际上导致了问题

bp = Blueprint('api_jsonrpc', __name__, url_prefix='/api')

url_prefix不应该出现在代码中,因为我已经在/api安装了此应用。添加/api url_prefix将导致跟随网址/api/api/JSONRPC。删除上述行修复了问题。

因此,如果您使用/DispatcherMiddleware的不同挂载点上宣传您的应用,则不应在蓝图中url_prefix