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 请求来执行更改发布日期等操作。
方法太多了:
为发布创建 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)
- 在博客 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"),
我是 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 请求来执行更改发布日期等操作。
方法太多了:
为发布创建 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)
- 在博客 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"),