请求上下文

不要用全局变量

aiohttp.web不鼓励使用全局变量实现的「单例」。每个变量都应该有自己的上下文,而不是全局的。

全局变量通常被认为是不好的做法,因为它们在跟踪变量的状态变化方面增加了复杂性。

aiohttp在设计上不使用全局变量,这将减少bug的数量和用户的意外行为。例如,一个i18n翻译的字符串被写入一个请求,然后被提供给另一个请求。

所以ApplicationRequest支持collections.abc.MutableMapping接口(即它们是类似于dict的对象),允许它们被用作数据存储。

应用级上下文

对于存储类似全局的变量,可以随意将它们保存在一个应用程序实例中。

app['my_private_key'] = data

就能在endpoint中得到它的值。

async def handler(request):
    data = request.app['my_private_key']

请求级上下文

只在请求级有效期内需要的变量,可以存储在一个请求中。

async def handler(request):
  request['my_private_key'] = "data"
  ...

参考