如何改善此安全码的代码

2024-04-25 18:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些商店,销售产品(每家商店都有自己的产品),我正在实施一项安全检查,以防止一家商店干扰其他商店的产品(以防用户是某种聪明的裤子)。你知道吗

假设用户有权编辑此产品(Id 75)

http://localhost:8000/produtos/edit/75/

但不是这个(身份证号100)

http://localhost:8000/produtos/edit/100/

我希望创建一个_check_permission方法,既可以在get中使用,也可以在post中使用,但似乎我仍然需要调用另一个if permission is not None来实际触发给用户的消息。你知道吗

有什么改进的建议吗?似乎有很多代码冗余,而且不是很pythonic(更少的代码)。你知道吗

@method_decorator(login_required, name='dispatch')                                                            
class EditarProdutoView(View):                                                                                
    template = 'principal/editar_produto.html'
    def get(self, request, produto_id=None):                                                                  
         produto = Produto.objects.get(pk=produto_id)                                                          
         permission = self._check_permission(produto, request)                                                 
         if permission is not None:                                                                            
             return permission                                                                                 

         form_editar_produto = EditarProdutoForm(                                                              
             prefix='produto',                                                                                 
             instance=produto,                                                                                 
         )                                                                                                     
         return render(request, self.template, locals())                                                       

     def post(self, request, produto_id=None):                                                                 
         produto = Produto.objects.get(pk=produto_id)                                                          
         permission = self._check_permission(produto, request)                                                 
         if permission is not None:                                                                            
             return permission                                                                                 

         form_editar_produto = EditarProdutoForm(                                                              
             request.POST,                                                                                     
             prefix='produto',                                                                                 
             instance=produto,                                                                                 
         )                                                                                                     
         if (form_editar_produto.is_valid()):                                                                  
             revenda = Revenda.objects.get(pk=request.user.id)                                                 
             form_editar_produto.save(revenda, commit=False)                                                   
             return redirect("produtos")                                                                       
         else:                                                                                                 
             return render(request, self.template, locals())                                                   

     def _check_permission(self, produto, request):                                                            
         if produto not in request.user.produto_set.all():                                                     
             return HttpResponseForbidden("Produto indisponível nesta revenda.") 

Tags: selfnoneidgetreturnif产品is