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

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

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

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


person Niklas    schedule 06.12.2015    source источник


Ответы (3)


В настоящее время нет встроенного способа сделать это; однако есть планы добавить эту функцию.

person Jashandeep Sohi    schedule 06.12.2015

В настоящее время, начиная с aiohttp версии 2.0, самый простой способ вернуть один файл в качестве ответа — использовать недокументированный (?) объект FileResponse, инициализированный путем к файлу, например

from aiohttp import web

async def index(request):
    return web.FileResponse('./index.html')
person thmp    schedule 24.03.2017

Я написал приложение, которое обрабатывает uri на клиенте (угловой маршрутизатор).

Для обслуживания веб-приложения я использовал немного другую фабрику:

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"))
person eri    schedule 11.10.2016