aiohttp: подавать один статический файл
как обслуживать один статический файл (вместо всего каталога) с помощью aiohttp?
статическая подача файлов, похоже, запечена в систему маршрутизации с UrlDispatcher.add_static(), но это лишь целые каталоги.
(Я знаю, что в конце концов я должен использовать что-то вроде nginx для обслуживания статических файлов в рабочей среде.)
3 ответов
в настоящее время нет встроенный способ сделать это, но есть планы в движении к добавить эту функцию.
В настоящее время, начиная с aiohttp версии 2.0, самый простой способ вернуть один файл в качестве ответа-использовать недокументированный (?) FileResponse
объект, инициализированный путем к файлу, например
from aiohttp import web
async def index(request):
return web.FileResponse('./index.html')
Я написал приложение, которое обрабатывает uri на клиенте (угловой маршрутизатор).
для обслуживания webapp я использовал немного другую фабрику:
def index_factory(path,filename):
async def static_view(request):
# prefix not needed
route = web.StaticRoute(None, '/', path)
request.match_info['filename'] = filename
return await route.handle(request)
return static_view
# json-api
app.router.add_route({'POST','GET'}, '/api/{collection}', api_handler)
# other static
app.router.add_static('/static/', path='../static/', name='static')
# index, loaded for all application uls.
app.router.add_get('/{path:.*}', index_factory("../static/ht_docs/","index.html"))