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