aiohttp: подавать один статический файл


Как обслуживать один статический файл (вместо целого каталога) с помощью aiohttp?

Статическая подача файлов, похоже, запекается в системе маршрутизации с помощью UrlDispatcher.add_static () , но он обслуживает только целые каталоги.

(я знаю, что в конечном итоге мне придется использовать что-то вроде nginx для обслуживания статических файлов в рабочей среде.)

3 10

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"))