2012-10-08 45 views
0

看起来,模块变量只要进程存在并且在进程重新启动之前不会重置。Django不会在多个请求期间重置模块变量

这里是我的代码,我希望表现的另一种方式,它现在的行为:

我负责各种搜索引擎优化功能,如面包屑和标题模块,文件花哨/ utils.py:

class Seo: 
    title = ['project name'] 

在我的意见后,我可以将项目添加到Seo.title(news.views为例):

from fancy.utils import Seo 

def index(request, news_id): 
    title.append('some specific title') 
    ... 

的一点是,可变Seo.title实际上不会在每次请求时重置,因此它会继续将项目追加到自身,并且对我来说看起来很奇怪(因为我来自PHP)。

最终,如果我在相同的页面上打F5标题总是长大,以防大和长。

发生了什么,我该怎么办?

感谢

+0

为什么你需要一个班呢?看起来像一个字典将是一个更好的解决方案。 –

+0

你能解释一下吗? – mennanov

+0

解释一下什么?你应该解释为什么你认为你需要在这里上课。本地字典更有意义。 –

回答

3

从您的意见看来,您完全误解了Django的执行模型。

您不能在请求中拥有本地数据,您可以通过某种方式从代码中的任何位置访问数据。如果您需要与特定请求相关联的数据,则应将其存储在运行该请求的代码可以检索到的地方:可能在会话中,可能在添加到请求对象本身的临时字典中。您在全球范围内存储的任何内容都将是全局的:对于在同一进程中运行的任何请求都可见。

+0

好吧,现在我明白了这一点(顺便说一句,如果你分享了一些关于这个Python行为的链接,因为我在django文档中找不到任何关于它的东西,那将是很好的)。 那么你认为最好的方法来实现标题标签功能(不完全标题标签,可能是一些其他相关的东西)? – mennanov

1

title是一个类属性不是一个instance属性。如果你想保留多个请求的设置,你可以在session中保留对它的引用。

例如

class Seo(object): 
    def __init__(self): 
     self.title = ['project name'] 

... 

def index(request, news_id): 
    seo = request.session.get('seo', Seo()) 
    seo.title.append('some specific title') 
+0

>如果您想保留多个请求的设置,您可以在会话中保留对它的引用。 不,我只是希望这些变量在每个请求上都重置。我不需要在请求之间保持流畅,也不需要有一个Seo类的实例来修改它的变量。 有没有其他方法可以做到这一点?我需要一个优雅的解决方案。 – mennanov

+1

你不能用class属性来做到这一点。属性值在进程的整个生命周期中保持不变。你可以创建新的上下文变量:title = Seo.title + ['some specific title'] –

+0

那么请求之间共享的所有类属性如何?全局变量呢,他们也分享了吗? – mennanov