我正在使用类视图转换旧项目,我想知道我使用的模式是否是"安全"。
简而言之,我有一个类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 而不依赖于类属性? 这是线程安全的吗?
答案 0 :(得分:0)
您这里没有使用类属性。即使你已经在类级别定义了filebox_random
,通过在Python的实例方法中为该名称设置一个值,你实际上创建了一个具有相同名称的实例属性,它隐藏了类级别的实例属性。 (虽然我不确定你为什么要首先定义class属性。)
Django在幕后做了大量的工作,以确保基于类的视图是线程安全的,因此设置实例属性没有任何危险。