Django FormView success_url参数建议

时间:2014-03-16 08:18:48

标签: django

我正在使用类视图转换旧项目,我想知道我使用的模式是否是"安全"。

简而言之,我有一个类View(代码简化):

class FileAddHashedView(FormView):
    """This view hashes the file contents using md5"""

    form_class = FileUploadForm
    success_url = reverse_lazy('vault-show')
    template_name = "vault/add.html"
    filebox_random= 0

    def get_success_url(self):
        return reverse('vault-show', kwargs={'random': self.filebox_random})

    def form_valid(self, form):

        instance = form.save(commit=False)

        #generate a random number
        rng = random.SystemRandom()
        #TODO: must catch exception here
        instance.random=rng.randint(0, sys.maxint)

        instance.save()
        #TODO: check what is the proper way to generate the parametric URL
        self.filebox_random=instance.random
        messages.success(
            self.request, 'File hashed and uploaded!', fail_silently=True)

        return super(FileAddHashedView, self).form_valid(form)


    def form_invalid(self, form, **kwargs):
        messages.error(self.request, 'Upload failed ...', fail_silently=True)
        return super(FileAddView, self).form_invalid(form)

以及被激活的相应视图:

class VaultStatus(TemplateView):
    template_name = 'vault/vault.html'

    def get(self, request,random):
        # retrieve object info

        data = {
            'filebox': FileBox.objects.get(random=random)
        }
        return render(request,self.template_name,data)
        #return render_to_response('vault/vault.html', {'random': random});

现在我的问题是: get_success_url 是否有更好的方法来获取 self.filebox_random 而不依赖于类属性? 这是线程安全的吗?

1 个答案:

答案 0 :(得分:0)

您这里没有使用类属性。即使你已经在类级别定义了filebox_random,通过在Python的实例方法中为该名称设置一个值,你实际上创建了一个具有相同名称的实例属性,它隐藏了类级别的实例属性。 (虽然我不确定你为什么要首先定义class属性。)

Django在幕后做了大量的工作,以确保基于类的视图是线程安全的,因此设置实例属性没有任何危险。