2013-08-30 45 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内部启动它的。 –