我在回顾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条目。 –