【问题标题】:Django class based view - Thread Safe基于 Django 类的视图 - 线程安全
【发布时间】:2015-12-20 18:56:41
【问题描述】:

我在 Java 中的 Web 应用程序方面有一些经验。在 servlet 中,您必须将基于类的属性声明为 final,因为它不是线程安全的。

当我尝试与基于 Django 类的视图进行比较时。假设下面的代码是线程安全的是否安全?我相信它的线程是安全的,但有人告诉我在 Django 中处理多线程应用程序需要注意的事项列表。

class MyFormView(View):
    form_class = MyForm
    initial = {'key': 'value'}
    template_name = 'form_template.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        person = Person()
        if form.is_valid():
            # <process form cleaned data>
            return HttpResponseRedirect('/success/')

        return render(request, self.template_name, {'form': form})

编辑-1

创建了一个新类并在 POST 方法中启动

类人(对象): 名称 = '样本'

【问题讨论】:

标签: django multithreading


【解决方案1】:

基于类的视图上的类属性在所有线程之间共享,并且通常不是线程安全的。您应该将类​​属性视为只读属性,这也是 Django 所做的。这意味着您可以将initial 设置为字典,但永远不要修改该字典。传递给View.as_view() 的参数也是如此。

实例属性是线程安全的。每次调用视图时,都会创建视图类的一个新实例,该实例永远不会跨线程共享。这意味着您可以设置和修改实例属性,例如self.object,而不必担心并发线程。

【讨论】:

  • 谢谢..在上述情况下...MyForm 对于每个线程都可能不同,并且看起来像是基于类的属性..Django 如何管理这个?
  • 它是一个类属性,所以你不应该改变它。相反,FormMixin 提供了一个 get_form_class() 方法,您可以覆盖该方法以返回 self.form_class 以外的其他内容。基于类的视图有许多这样的方法,您可以重写这些方法以提供与上下文相关的值。
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2018-05-14
  • 2014-02-21
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多