2013-08-30 48 views
0

我在回顧Django的TemplateView,因爲我們在使用來自單個網頁的AJAX併發調用同一服務時看到的線程問題。Django TemplateView線程安全

症狀是你期望的與服務器上的請求/響應相關的線程問題。有時,我們期望從第一次調用中得到的值會返回到第一次和第二次,有時會顛倒過來,有時會按預期工作。如果我們序列化AJAX調用,結果總是正確的。

看代碼,我看到TemplateView從TemplateResponseMixin,它具有以下實現繼承:

def render_to_response(self, context, **response_kwargs): 
    """ 
    Returns a response, using the `response_class` for this 
    view, with a template rendered with the given context. 

    If any keyword arguments are provided, they will be 
    passed to the constructor of the response class. 
    """ 
    response_kwargs.setdefault('content_type', self.content_type) 
    return self.response_class(
     request = self.request, 
     template = self.get_template_names(), 
     context = context, 
     **response_kwargs 
    ) 

所以,TemplateView需要一個名爲self.request實例變量。如果給定的TemplateView子類實例用於提供併發請求,我想你會看到我們看到的行爲。

我說得對嗎?在處理併發請求方面,我還沒有探索過Django的線程模型。如果他們的線程模型與我曾經使用過的每個Java Servlet引擎中使用的線程模型相似,那麼我想不出這種方式沒有被破壞。如果Django使用TemplateView實例池來處理併發請求,或者做了一些基本的排隊請求之類的事情,那麼我正在尋找錯誤的地方,我們需要尋找其他地方來解決我們的線程問題。

在此先感謝您的幫助。

+0

你應該發佈你的這個視圖的urls.py條目。 –

回答

4

每個請求都有一個視圖實例,您可以在View.as_view(這是您在URL conf中調用的實現)的實現中找到執行此操作的代碼。但是,一些Template Tags不是線程安全的。

爲了進一步幫助您,我認爲您需要告訴我們更多關於您所看到的確切問題的信息。您可能還想告訴我們您使用什麼技術爲請求提供服務 - 是mod_wsgi,Gunicorn還有其他什麼?

+0

謝謝,托馬斯。在考慮了五個星期之後,我在一些請求中記錄了我的視圖的對象ID,並且看到你是對的,每次都創建一個新對象。回到繪圖板。爲了回答你的問題,我團隊的另一位開發人員在他自己的Windows開發框中看到了這一點,大概是從Eclipse內部啓動它的。 –