Django:每个实例的权限

问题描述 投票:1回答:1

目前,我打算写一个网站,用户可以写博客文章。我还没有开始实现,因为我是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的初学者,我认为这已经足够了。

python django
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.