如果我的处理程序在不同的文件中,我的应用程序会给出 404 not found

if my handlers are in different file, my app gives 404 not found

我正在尝试中间件,但即使请求有效,也找不到中间件为请求编码的情况。然后我删除了中间件并测试请求是否有效以及是否无效。我不确定发生了什么变化,但 AFAIR,这些文件正在工作。 如果我将 views.py 中的处理程序(即 index_view 和 subapp_view 添加回 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 中,这是在解释器导入和解析源文件时计算的。

您需要确保解释器 "sees" 通过 import views 文件 views.py。在您的示例中,该文件被忽略,因为没有任何东西可以导入它。您必须手动执行此操作 - 您实际上不需要引用它并不重要。