2014-08-27 108 views
2

这听起来很讨厌。我想设置在请求一个全局变量,这意味着我的意见,可以通过做指的是常数:设置全局常量跨越所有视图

getattr(request, 'CONSTANT_NAME', None) 

然而,这个变量的值可能会在某个时候发生改变,这意味着我有以下代码在我看来之一:

setattr(request, 'CONSTANT_NAME', VALUE) 

我知道我这样做肯定是不对的方式,但我想知道是否有达到我所期待的正确和清洁的方式。

我在想中间件,但不知道该怎么做。一个提示就足够了。

在此先感谢。

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

+0

您是否尝试过Django Sessions?这里是链接:https://docs.djangoproject.com/en/dev/topics/http/sessions/#bundled-serializers这让你得到并设置变量到会话中。或者,您可以使用context_processor在视图之间使用全局变量。 – 2014-08-27 22:05:08

+0

最好的方法实际上取决于价值意味着什么以及如何使用它。如果它要与会话相关联,则将其添加到会话对象。如果是别的,你可能需要一个不同的解决方案。 – Louis 2014-08-27 22:05:21

+0

@AronYsidoro Session是我最后一次打赌。我不想使用它的原因是我的变量不是会话特定的,而是服务器特定的。会议可行,但不够干净。上下文处理器不是选项。我不认为我改变了情境处理器 – 2014-08-27 22:10:18

回答

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 

在这一点上,我调用设置,并从我想要的任何视图此服务器的交叉变量。

解决方案并不完美(我相信)。如果有人有更好的主意,请让我知道!

谢谢!