2015-12-06 2 views
6

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

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

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

ответ

4

В настоящее время не существует встроенный способ сделать это; однако есть планы в отношении add this feature.

1

Я написал приложение, которое обрабатывает 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")) 
6

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

from aiohttp import web 

async def index(request): 
    return web.FileResponse('./index.html')