aiohttp:提供单个静态文件

时间:2015-12-06 19:42:59

标签: http python-asyncio aiohttp

如何使用aiohttp提供单个静态文件(而不是整个目录)?

静态文件服务似乎被UrlDispatcher.add_static()引入路由系统,但这只服务于整个目录。

(我知道我最终应该使用类似nginx的东西在生产环境中提供静态文件。)

4 个答案:

答案 0 :(得分:11)

目前,从aiohttp 2.0版开始,将单个文件作为响应返回的最简单方法是使用未记录的(?)FileResponse对象,并使用文件路径进行初始化,例如

from aiohttp import web

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

答案 1 :(得分:4)

目前没有内置的方法可以做到这一点;但是,有计划动议add this feature

答案 2 :(得分:3)

我编写了App,它在客户端处理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"))

答案 3 :(得分:0)

# include handler path
app['static_root_url'] = '/static'    

# path dir of static file
STATIC_PATH = os.path.join(os.path.dirname(__file__), "static")    
app.router.add_static('/static/', STATIC_PATH, name='static')

# include in template
<link href="{{static('/main.css')}}" rel="stylesheet">