我的Django项目中的权限机制
admin
2023-07-31 00:44:31
0

本文主要介绍我在Django博客使用的权限设置,我的博客中几乎所有的权限设置都是我自己写的。这么做的原因是我在写Flask博客的时候,学到了一些这方面的知识,感觉很不错。因此就借鉴里面的逻辑,自己写了这方面的代码。

1、关于文章的访问权限

我就从Model和View两层来说。

首先我在Model中定义一个字段,用来指示是否公开,是否允许别人可见: 源代码如下:

1234567891011 ACCESS = {    100:u\’公开\’,    200:u\’私人可见\’}class Article(models.Model):     title = models.CharField(max_length=150,unique=True,verbose_name=u\’标题\’)    alias = models.CharField(max_length=150,verbose_name=u\’英文标题\’)    ..........    ..........    access = models.IntegerField(default=100,choices=ACCESS.items(),verbose_name=u\’文章权限,公开或者私人可见\’)

access字段指定该字段是否公开。如果设为公开那么所有人可以访问;如果设为私密,那么就不允许一些用户访问。那此时问题来了,该如何设置限制访问逻辑。我的代码如下,该方法也定义在Model中:

12345678 def can_access(self,user):    if self.access == 100:        return True    if self.access == 200:        if user is None:            return False        else:            return self.author.id == user.id or user.is_staff

上面的代码很简单,如果是私密的,只有文章作者或者管理员可以访问。

在View中的代码:

123456789101112131415161718 class ArticleDetailView(BaseMixin,DetailView):    queryset = Article.objects.filter(status=0)    slug_field = \’alias\’    context_object_name = \’article\’    template_name = \’article.html\’    object = None     def get(self, request, *args, **kwargs):        alias = self.kwargs.get(\’slug\’)        try:            self.object = self.queryset.get(alias=alias)        except Article.DoesNotExist:            logger.error(\’article does not exsists\’)            #I should rewrite the 404 html later            return HttpResponseNotFound(\’Page not Found\’)        # add permission,if the article has set permission,the web will raise one exveption        if not self.object.can_access(request.user):            raise PermissionDenied

看这段代码最后面,如果can_acees方法返回False,就抛出一个禁止Django内置的禁止访问的异常,即返回403页面。

2、自定义视图权限装饰器

首先自己定义一个装饰器函数,用来修饰要设置权限的视图函数或类方法。 装饰器函数源代码:

12345678910111213141516171819202122232425262728293031323334 from functools import wrapsfrom django.http import HttpResponse,HttpResponseRedirectmport wrapsfrom django.http import HttpResponse,HttpResponseRedirect觉很不错。因此就借鉴里面的逻辑,自己写了这方面的代码。

1、关于文章的访问权限

我就从Model和View两层来说。

首先我在Model中定义一个字段,用来指示是否公开,是否允许别人可见: 源代码如下:

1234567891011 ACCESS = {    100:u\’公开\’,    200:u\’私人可见\’}class Article(models.Model):     title = models.CharField(max_length=150,unique=True,verbose_name=u\’标题\’)    alias = models.CharField(max_length=150,verbose_name=u\’英文标题\’)    ..........    ..........    access = models.IntegerField(default=100,choices=ACCESS.items(),verbose_name=u\’文章权限,公开或者私人可见\’)

access字段指定该字段是否公开。如果设为公开那么所有人可以访问;如果设为私密,那么就不允许一些用户访问。那此时问题来了,该如何设置限制访问逻辑。我的代码如下,该方法也定义在Model中:

12345678 def can_access(self,user):    if self.access == 100:        return True    if self.access == 200:        if user is None:            return False        else:            return self.author.id == user.id or user.is_staff

上面的代码很简单,如果是私密的,只有文章作者或者管理员可以访问。

在View中的代码:

123456789101112131415161718 class ArticleDetailView(BaseMixin,DetailView):    queryset = Article.objects.filter(status=0)    slug_field = \’alias\’    context_object_name = \’article\’    template_name = \’article.html\’    object = None     def get(self, request, *args, **kwargs):        alias = self.kwargs.get(\’slug\’)        try:            self.object = self.queryset.get(alias=alias)        except Article.DoesNotExist:            logger.error(\’article does not exsists\’)            #I should rewrite the 404 html later            return HttpResponseNotFound(\’Page not Found\’)        # add permission,if the article has set permission,the web will raise one exveption        if not self.object.can_access(request.user):            raise PermissionDenied

看这段代码最后面,如果can_acees方法返回False,就抛出一个禁止Django内置的禁止访问的异常,即返回403页面。

2、自定义视图权限装饰器

首先自己定义一个装饰器函数,用来修饰要设置权限的视图函数或类方法。 装饰器函数源代码:

12345678910111213141516171819202122232425262728293031323334 from functools import wrapsfrom django.http import HttpResponse,HttpResponseRedirectno\” data-settings=\”dblclick\” readonly style=\”-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 13px !important; line-height: 15px !important;\”>
def can_access(self,user):
if self.access == 100:
return True
if self.access == 200:
if user is None:
return False
else:
return self.author.id == user.id or user.is_staff

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...