Django TemplateView 线程安全

Posted

技术标签:

【中文标题】Django TemplateView 线程安全【英文标题】:Django TemplateView thread safety 【发布时间】:2013-09-03 10:33:08 【问题描述】:

我正在审查 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 实例池来处理并发请求,或者它做了一些基本的事情,比如排队请求,那么我找错地方了,我们需要寻找其他地方来解决我们的线程问题。

提前感谢您的帮助。

【问题讨论】:

您应该为此视图发布 urls.py 条目。 【参考方案1】:

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

然而,一些 Template Tags 不是线程安全的。

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

【讨论】:

谢谢,托马斯。在考虑了另外五周之后,我刚刚在几个请求期间记录了我的视图的对象 ID,发现你是对的,每次都会构造一个新的。回到绘图板。为了回答你的问题,我团队的另一位开发人员在他自己的 Windows 开发盒上看到了这个,大概是从 Eclipse 内部启动的。

以上是关于Django TemplateView 线程安全的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中使用 TemplateView 时设置 Mimetype

Django TemplateView 与 DetailView

Django:使用TemplateView在Django表单中添加编辑和删除功能的问题

authenticate()和login()实现用户登录 | Django

get_template_names(self) 在 TemplateView 中不起作用

Django,动态 urlconfs,线程安全