Routes 如果我的处理程序位于不同的文件中,我的应用程序将提供404 not found

Routes 如果我的处理程序位于不同的文件中,我的应用程序将提供404 not found,routes,python-3.6,python-decorators,aiohttp,Routes,Python 3.6,Python Decorators,Aiohttp,我正在尝试中间件,但没有找到中间件为请求编写的代码,即使请求是有效的。然后,我删除了中间件,并测试了请求是否正常工作。我不知道发生了什么变化,但这些文件正在运行。 如果我将views.py中的处理程序(即index_视图和subapp_视图)添加回main.py,代码就会正常工作 这是main.py from aiohttp import web import asyncio app_routes = web.RouteTableDef() subapp_routes = web.RouteT

我正在尝试中间件,但没有找到中间件为请求编写的代码,即使请求是有效的。然后,我删除了中间件,并测试了请求是否正常工作。我不知道发生了什么变化,但这些文件正在运行。 如果我将views.py中的处理程序(即index_视图和subapp_视图)添加回main.py,代码就会正常工作

这是main.py

from aiohttp import web
import asyncio

app_routes = web.RouteTableDef()
subapp_routes = web.RouteTableDef()


def init():
    greet = web.Application()
    greet.router.add_routes(subapp_routes)

    app.router.add_routes(app_routes)

    app.add_subapp('/greet/', greet)
    web.run_app(app, host='127.0.0.1', port=8089)


async def shutdown(server, handler, app):
    server.close()
    await server.wait_closed()
    app.client.close() # db connection closed
    await app.shutdown()
    await handler.finish_connections(10.0)
    await app.cleanup()


loop = asyncio.get_event_loop()
app = web.Application(loop=loop)

serv_generator, handler, application = loop.run_until_complete(init())
serv = loop.run_until_complete(serv_generator)

try:
    loop.run_forever()
except KeyboardInterrupt:
    print(' Stop server begin')
finally:
    loop.run_until_complete(shutdown(serv, handler, application))
    loop.close()
print('Stop server end')
这是views.py

from aiohttp import web
from main import app_routes, subapp_routes

@app_routes.get('/')
async def index_view(request):
    return web.Response(text='index\n')


@subapp_routes.get('/{name}')
async def subapp_view(request):
    name = request.match_info.get('name', "Anonymous")
    txt = "Hello {}\n".format(name)
    return web.Response(text=txt)

我是否遗漏了任何进口声明?我没有收到任何编译器错误

通过反复试验解决了这个问题。不确定为什么会这样,但显然应该在使用装饰器路由的位置定义它们。下面是正确的代码

main.py

from aiohttp import web
from views import app_routes, subapp_routes

    def init():
        greet = web.Application()
        greet.router.add_routes(subapp_routes)

        app.router.add_routes(app_routes)

        app.add_subapp('/greet/', greet)
        web.run_app(app, host='127.0.0.1', port=8089)


    async def shutdown(server, handler, app):
        server.close()
        await server.wait_closed()
        app.client.close() # db connection closed
        await app.shutdown()
        await handler.finish_connections(10.0)
        await app.cleanup()


    loop = asyncio.get_event_loop()
    app = web.Application(loop=loop)

    serv_generator, handler, application = loop.run_until_complete(init())
    serv = loop.run_until_complete(serv_generator)

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        print(' Stop server begin')
    finally:
        loop.run_until_complete(shutdown(serv, handler, application))
        loop.close()
    print('Stop server end')
views.py

from aiohttp import web

app_routes = web.RouteTableDef()
subapp_routes = web.RouteTableDef()

@app_routes.get('/')
async def index_view(request):
    return web.Response(text='index\n')


@subapp_routes.get('/{name}')
async def subapp_view(request):
    name = request.match_info.get('name', "Anonymous")
    txt = "Hello {}\n".format(name)
    return web.Response(text=txt)

您没有收到任何错误,但路由没有正确注册

我没有看过aiohttp代码,但我假设装饰器修改了给定的路由集。在Python中,当源文件被解释器导入和解析时,会对其进行评估

您需要确保解释器通过导入视图“看到”了
views.py
文件。在您的示例中,该文件被忽略,因为没有可导入的内容。您必须手动执行此操作-实际上不需要对它的引用并不重要