这听起来很讨厌。我想在请求中设置一个全局变量,这意味着我的所有视图都可以通过执行以下操作来引用该常量:
getattr(request, 'CONSTANT_NAME', None)
但是,此变量的值可能会在某个时候更改,这意味着我在以下某个视图中有以下代码:
setattr(request, 'CONSTANT_NAME', VALUE)
我知道我这样做的方式肯定是错的,但我想知道是否有正确而干净的方式来实现我所寻找的目标。
我正在考虑中间件,但不知道该怎么做。提示就足够了。
先谢谢。
更新: 有人提到了Session。我很确定它应该有效。但是,它不够干净。通过使用会话,我需要创建与服务器维护的会话总数相同的常量。实际上,常量与服务器保持一致,并且必须是可变的!最后一个要求是讨厌的部分。
答案 0 :(得分:1)
最终,我采取了中间件的方式。我编写了一个自定义中间件并在中间件中设置了一个变量,比如,
CONSTANT_NAME = None
这是全球性的。 一个本地线程:
_thread_local = threading.local()
也是全球性的。
然后我在中间件中有两种方法,
def get_constant_value()
return getattr(_thread_local, 'CONSTANT_NAME', None)
def set_constant_value(value):
CONSTANT_NAME = value
可以从任何视图中调用。
然后在我的中间件中,我有
def process_request(self, request):
_thread_local.CONSTANT_NAME = CONSTANT_NAME
此时,我调用set并从我想要的任何视图中获取此服务器交叉变量。
解决方案并不完美(我相信)。如果有人有更好的想法,请告诉我!
谢谢!