设置全局常量交叉所有视图

时间:2014-08-27 21:30:37

标签: python django

这听起来很讨厌。我想在请求中设置一个全局变量,这意味着我的所有视图都可以通过执行以下操作来引用该常量:

getattr(request, 'CONSTANT_NAME', None)

但是,此变量的值可能会在某个时候更改,这意味着我在以下某个视图中有以下代码:

setattr(request, 'CONSTANT_NAME', VALUE)

我知道我这样做的方式肯定是错的,但我想知道是否有正确而干净的方式来实现我所寻找的目标。

我正在考虑中间件,但不知道该怎么做。提示就足够了。

先谢谢。

更新: 有人提到了Session。我很确定它应该有效。但是,它不够干净。通过使用会话,我需要创建与服务器维护的会话总数相同的常量。实际上,常量与服务器保持一致,并且必须是可变的!最后一个要求是讨厌的部分。

1 个答案:

答案 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并从我想要的任何视图中获取此服务器交叉变量。

解决方案并不完美(我相信)。如果有人有更好的想法,请告诉我!

谢谢!