在 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