在Aiohttp的官方教程中对于静态文件链接没有详细说明,仅仅提了一下开发时如何将静态文件夹加入路由。那该如何配合Aiohttp在Aiohttp-jinja2中处理静态文件链接呢?能否像在Django中使用jinja2一个函数搞定?答案是肯定的。

不推荐方法

在官方教程中添加了一条路由:

def setup_static_routes(app):
    app.router.add_static('/static/',
                          path=PROJECT_ROOT / 'static',
                          name='static')

从理论上说,只要在jinja2中使用{{ url('static') }}即可的得到静态文件夹的路径,在后面加上文件名就能正常得到文件路径。然而这只能在开发中使用,在部署后我们都会用nginx之类来处理静态文件。而且这种字符串拼接实在比较难看,因此不推荐使用。

推荐方法

事实上Aiohttp-jinja2自带了两个上下文函数(contextfunction),一个是之前提到的url,另外一个就是static。在使用static函数之前,你需要在app中添加static_root_url,这个路径应该和你的静态文件夹所在路径相同,需要注意的是我使用了aiohttp-devtools加载静态文件夹。

app = web.Application()
app['static_root_url'] = 'http://127.0.0.1:8001/static/'

接下来就可以很轻松的使用了,例如你在static文件夹中有一个style.css,只需要使用{{ static('style.css') }}即可获得完整路径http://127.0.0.1:8001/static/style.css