2012-10-08 75 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