Django 项目为不同的视图view使用通用的全局变量。例如,menuand函数listing使用全局变量NON_APPROVED:
NON_APPROVED = Entries.objects.filter(approved=False) # глобальная переменная QuerySet
...
def menu(request):
global NON_APPROVED
...
context = { 'NON_APPROVED_CNT': NON_APPROVED.counter() } # количество экземпляров
return context
def listing(request):
global NON_APPROVED
...
context = { 'NON_APPROVED': NON_APPROVED } # список QuerySet
context.update(menu(request))
return render(request, '/template.html', context)
在这种情况下,全局变量NON_APPROVED对所有用户具有相同的值。这种方法与每个用户的会话完全隔离的假设结合使用。事实证明,这个假设是错误的,全局变量对所有工作用户都是可见的。但是,当任何用户更改其值时,都会出现“竞争”情况。
NON_APPROVED并且对于不同的用户 ,这些值必须是唯一的。
为此目的,普遍接受的技术是什么,包括 Django 推荐的技术,或者简单地说,适合跨用户组或个人用户隔离全局变量的解决方案?
你是对的,全局变量对所有用户都是一样的。这就是为什么它们是全球性的。发生以下情况。当用户发出 HTTP 请求时,只执行函数,而不执行之前的代码。因此,您示例中的第 1 行理论上只能执行一次,并且每个人的变量都相同。而且可能更“糟糕”:如果服务器是多线程的,那么就会有几个这样的全局变量,同一个用户会从一个“跳转”到另一个。
如果你想记录与会话相关的信息,那么 Django 有一个机制。这是文档。但是如果有缩放的角度(即程序会在多台服务器上执行),本地会话就不适合了,你需要要么使用数据库,要么,如果数据不重要,使用缓存,比如 Redis。