Django TemplateView线程安全

时间:2013-08-30 16:07:16

标签: python django multithreading django-templates django-views

我正在审查Django的TemplateView,因为我们在从单个网页使用AJAX同时调用同一服务时遇到了线程问题。

症状是您对服务器上的请求/响应相关的线程问题所期望的。有时我们从第一次调用中得到的值会返回到第一次和第二次,有时它会反转,有时它会按预期工作。如果我们序列化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实例池来处理并发请求,或者它做了一些像排队请求那样简陋的事情,那么我正在寻找错误的地方,我们需要寻找别的地方来解决我们的线程问题。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

每个请求都有一个视图实例,您可以在View.as_view的实现中找到执行此操作的代码(这是您在URL conf中调用的内容)。

但是,某些Template Tags不是线程安全的。

为了进一步帮助你,我想你需要告诉我们更多关于你所看到的确切问题的信息。您可能还想告诉我们您使用什么技术来处理请求 - 是mod_wsgi,Gunicorn还是其他什么?