Django:每个实例的权限

时间:2018-03-05 11:24:07

标签: python django

目前,我打算写一个用户可以撰写博客文章的网站。我还没有开始实施,因为我是Django的新手,想要了解如何解决问题并构建整个项目。

我的问题: 用户不得使用Django的管理页面(/ admin)。用户只应与我写的网站进行互动。

我网站上的用户可以创建博客帖子。现在,我必须确保只有博客文章的创建者才能够编辑/删除自己的帖子。所有其他用户应该只能阅读这篇文章。

所以,我需要每个用户/实例的权限。我知道有一些像django-guardian这样的全面许可系统,但我更愿意自己解决它。还要更好地理解Django框架。

我已经阅读过Django文档了,但我不知所措。

我想这是一个常见的问题,我也有一个解决这个问题的常见方法。有人可以帮助我在哪里看,从哪里开始?

到目前为止我的想法(请发表评论):

创建类似blog/5/edit的页面,只有创建博客文章号5的用户才能访问该页面。这应该很容易在视图功能中,对吗?在此页面上有一个用于编辑博客文章的表单。

这个视图(伪代码!)

if request.user != blogpost.user:
    redirect/error page
else:
    show Form/process Form

这样安全吗?到目前为止,我在搜索互联网时还没有找到这样的解决方案。然而,自发地,作为Django的初学者,我认为这已经足够了。

1 个答案:

答案 0 :(得分:0)

是的,你可以这样做。为此,我建议创建一个自定义装饰器,如下所示:

decorators.py

from django.core.exceptions import PermissionDenied
from .models import YourBlogPostModel

def user_is_blog_post_user(function):
    def wrap(request, *args, **kwargs):
        post = YourBlogPostModel.objects.get(pk=kwargs['blog_post_id'])
        if post.user == request.user:
            return function(request, *args, **kwargs)
        else:
            raise PermissionDenied
    wrap.__doc__ = function.__doc__
    wrap.__name__ = function.__name__
    return wrap

然后,您可以将其与其他装饰器一起使用。

views.py

@login_required
@user_is_blog_post_user
def function_based_view(request, blog_post_id):
    # ...

请查看here以获取更详细的说明。

如果您使用的是CVB,则可以创建自己的Mixindecorate the class

class UserIsBlogPostAdmin(object):
     """Verify that the current user is the user of the blog post."""
     def dispatch(self, request, *args, **kwargs):
         blog_post = get_object_or_404(YourBlogPostModel, pk=args[0])
         if blog_post.user != request.user
             raise Http404
         return super().dispatch(request, *args, **kwargs)