2013-03-26 18 views
5

我似乎很難在我的一箇中間件類中設置一個變量,然後我可以在模板層訪問該變量。在中間件中設置一個變量,以便在模板中訪問

基本佈局是:

class TheMiddleware(object): 
    def __init__(self, etc): 
     stuff... 

    def process_response(self, request, response): 
     request.my_var = "whatever" 
     return response 

然後在模板不同的看法,我有:

{% custom_tag arg_a %} 

這是一個模板標籤應該從請求返回的變量:

@register.simple_tag 
def custom_tag(arg_a): 
    return threading.currentThread().request.my_var 

這個錯誤與「Caught AttributeError whil e渲染:'WSGIRequest'對象沒有屬性'my_var'「

我認爲這可能是我在模板標籤中訪問請求的方式。所以我將django.core.context_processors.request添加到我的TEMPLATE_CONTEXT_PROCESSORS,如This question,並嘗試將請求對象傳遞給標記,然後直接從模板訪問請求,但沒有運氣。

我想我對於請求對象的工作方式缺乏瞭解。是否可以將一個變量分配給一個請求對象,然後在該變量上選擇幾個視圖?我認爲請求對象是通過視圖傳遞的,但似乎是生成了一個新的實例。

如果是這樣的話,你會如何在中間件中存儲一個全局變量,然後你可以從你的應用中的任何點訪問它,無論是在視圖還是模板中?

更新

要清理混亂(我或其他人是否我不知道!)我不試圖設置請求變量視圖中的process_response中間件,然後在相同視圖的模板中挑選它。我知道這是行不通的,因爲模板在變量保存之前已經被處理了。 (這是我的一個故意行爲)。

我有兩個視圖,廠景視圖2視圖一個具有使中間件設置變量在所述請求的裝飾。這是view2模板,它在變量被設置之後出現,我希望訪問這個變量。

回答

7

您試圖在處理中間件響應期間設置變量。

我想你應該實施process_request()而不是設置變量。

def process_request(self, request): 
    request.my_var = "whatever" 
    return 
+0

更新的問題,我的選擇process_response的是故意 – PT114 2013-03-26 10:09:43

+0

@ PT114,你的意思是有2個進來的2個不同的網址/看法單獨的請求? – Rohan 2013-03-26 10:12:25

+0

是的。我認爲這個請求和任何變量一直存在,但它看起來越來越像是不是這種情況。在這種情況下,你將如何去存儲一個可以全局訪問的變量? – PT114 2013-03-26 10:16:27

2

如果你在請求中設置它,我看不到任何理由嘗試在這裏使用threadlocals。您應該按照您的描述使用上下文處理器。

但是,您的問題的原因是,process_response運行在請求/響應週期的響應階段:即之後您的視圖已被調用。您應該定義process_request。有關調用中間件方法的順序的描述,請參見here

相關問題