如果我的处理程序在不同的文件中,我的应用程序会给出 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
。在您的示例中,该文件被忽略,因为没有任何东西可以导入它。您必须手动执行此操作 - 您实际上不需要引用它并不重要。
我正在尝试中间件,但即使请求有效,也找不到中间件为请求编码的情况。然后我删除了中间件并测试请求是否有效以及是否无效。我不确定发生了什么变化,但 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
。在您的示例中,该文件被忽略,因为没有任何东西可以导入它。您必须手动执行此操作 - 您实际上不需要引用它并不重要。