0

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

在此先感谢您的帮助。

4

1 回答 1

4

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

然而,一些模板标签不是线程安全的。

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

于 2013-08-30T16:24:07.833 回答