请求上下文
不要用全局变量
aiohttp.web不鼓励使用全局变量实现的「单例」。每个变量都应该有自己的上下文,而不是全局的。
全局变量通常被认为是不好的做法,因为它们在跟踪变量的状态变化方面增加了复杂性。
aiohttp在设计上不使用全局变量,这将减少bug的数量和用户的意外行为。例如,一个i18n翻译的字符串被写入一个请求,然后被提供给另一个请求。
所以Application
和Request
支持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"
...