我在回顧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實例池來處理併發請求,或者做了一些基本的排隊請求之類的事情,那麼我正在尋找錯誤的地方,我們需要尋找其他地方來解決我們的線程問題。
在此先感謝您的幫助。
你應該發佈你的這個視圖的urls.py條目。 –