Django:每个实例的权限
Posted
技术标签:
【中文标题】Django:每个实例的权限【英文标题】:Django: Permission per instance 【发布时间】:2018-08-13 01:02:39 【问题描述】:目前,我计划编写一个用户可以写博客文章的网站。我还没有开始实施,因为我是 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 初学者,我自发地认为这已经足够了。
【问题讨论】:
是的,没问题。 您可以将装饰器用于“您的想法”,然后您可以将装饰器应用于您需要权限的视图函数。您可以看到相同 docs.djangoproject.com/en/2.0/_modules/django/contrib/auth/… 的现有装饰器实现 【参考方案1】:是的,你可以这样做。为此,我建议创建一个自定义装饰器,如下所示:
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
,您可以创建自己的Mixin
或decorate 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)
【讨论】:
谢谢!使用 django-guardian 或其他第三方应用程序是多余的。 :)以上是关于Django:每个实例的权限的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django 和 django-guardian 对象权限的每个对象的组