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

Python 使用DispatcherMiddleware实例组合2个Flask应用程序会导致第二个应用程序出现404,python,flask,Python,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.pat

对不起,这个模棱两可的问题,我不知道我能说得多好。让我来解释我的问题

我有一个烧瓶应用程序,它有两个烧瓶应用程序,一个是前端,另一个是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和application.app以及application.mounts的值时,我看到了以下内容

>>> application.app
<Flask 'silpa.frontend'>
>>> application.mounts
{'/api': <Flask 'silpa.api'>}
>application.app
>>>应用程序安装
{'/api':}
我无法理解为什么/api/JSONRPC会导致404。我不确定如何调试它。我确实检查了api应用程序的app.url_映射,我可以看到在那里注册的/api/JSONRPC的规则


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

好的,在调试和逐步执行Flask代码后,我找到了问题的原因。下面的行实际上导致了问题

bp = Blueprint('api_jsonrpc', __name__, url_prefix='/api')
url\u前缀
不应出现在代码中,因为我已在
/api
上挂载此应用程序。添加
/api
url\u前缀将导致以下url而不是
/api/api/JSONRPC
。删除上面的行修复了该问题


因此,如果您使用
DispatcherMiddware
将应用程序安装在不同的安装点,而不是
DispatcherMiddware
,您不应该在blueprint中使用
url\u前缀

@bp.route('/JSONRPC',methods=['POST'])
?@lord63.j抱歉,我不明白您想说什么。路由是在路由装饰器中完成的。
@route(bp,/JSONRPC',methods=['POST'])
这行可以工作吗?应该可以工作。我重新检查了装饰声明,没有发现任何问题。我只是想弄明白为什么应用程序不起作用(我知道你已经解决了你的问题。你介意回答你自己的问题吗,这样其他与类似问题斗争的人就可以从中受益?避免堆栈溢出是可以的。