CBV 上的 Django 权限混合,如何在 'publish blog' 方法上应用

Django permissions mixin on CBV, how to apply on 'publish blog' method

我是 Django 的新手,我使用 Django 的 CBV。目前,我正在通过使用 LoginRequiredMixin、PermissionRequiredMixin 等将权限应用到我的项目。在视图中,它工作得很好!但是,我有一些基于函数的方法。

例如,通过 URL

发布博客

/blogs/1/publish

绑定到

url(r"^(?P<pk>[0-9]+)/publish/$", views.publish, name="publish"),

调用

def publish(request, pk):
    if request.method == "GET":
        Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
    return HttpResponseRedirect("/blogs/" + pk)

因为我使用 class-based-views,所以我的所有视图都可以使用 mixins 进行保护。基于功能,我不确定保护这些的适当方法是什么。

我是否应该以某种方式将这些基于函数的方法转换为 class 或 我应该创建方法装饰器来检查这些场合的权限吗?还是有其他更方便的方法?

Django 有像 login_required and permission_required 装饰器这样的装饰器,您可以将其用于基于函数的视图。实际上,这些在 Django 中的存在时间比在 Django 1.9 中添加的 CBV 的混入要长得多。

@permission_required('myapp.can_publish')
def publish(request, pk):
    if request.method == "GET":
        Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
    return HttpResponseRedirect("/blogs/" + pk)

顺便说一句,通常最佳做法是使用 POST 请求来执行更改发布日期等操作。

方法太多了:

  1. 为发布创建 CBV 并覆盖 post 方法:

    class PublishView(UpdateView):
    
        model = Blog
    
        def post(self, request, *args, **kwargs):
            pk = self.kwargs.get('pk', None)
            Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
            return HttpResponseRedirect("/blogs/" + pk)
    
    1. 在博客 UpdateView 中将发布定义为静态方法:
     class BlogUpdateView(UpdateView):

            model = Blog

            @staticmethod
            def publish(request, pk):
               if request.method == "GET":
               Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
               return HttpResponseRedirect("/blogs/" + pk)

在网址中,您可以直接访问您的功能您的发布方法

url(r"^(?P<pk>[0-9]+)/publish/$", views.BlogUpdateView.publish, name="publish"),