我的Django项目中的权限机制

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

1、关于文章的访问权限

我就从Model和View两层来说。

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

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

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

在View中的代码:

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

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

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

这是自己写的一个三层装饰器函数,代码很简单。如果http_exception为403,当不是管理员权限就抛出禁止访问异常;当http_exception为401,当用户没有登录就跳转到登录页面。

在View中:

这是一个用于测试的视图函数。

上面讲解了如何使用装饰器函数装饰视图函数,那么该如何装饰基于类的视图呢?
在Django中的官网上给出了答案。

最简单的方法是在URLconf 中装饰,装饰类的as_view方法:

如现在我在View中定义了一个基于类的视图:

直接在URl中配置: url(r’^author/$’, permission_forbidden(http_exception=403)(AuthorView.as_view()),name=’blog_author’),

这样就可实现上面对视图函数相同的装饰。这个方法在每个实例的基础上运用装饰器。如果想让视图的每个实例都被装饰,你需要一种不同的方法。

下面是摘抄自官方文档:

类的方法和独立的函数不完全相同,所以你不可以直接将函数装饰器运用到方法上 —— 你首先需要将它转换成一个方法装饰器。

method_decorator 装饰器将函数装饰器转换成方法装饰器,这样它就可以用于实例方法上。例如:

在这个例子中,ProtectedView 的每个实例都将有登录保护。

不过有一点要说明:我用这个方法测试没有成功!!!

上面说了这么多我自定义的权限设置,这里也说一下Django内置的权限系统。

详细的内容请参考下面的两个链接,一个是个人博客,一个是Django官方文档:

  • http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html
  • http://python.usyiyi.cn/django/topics/auth/default.html

我这里只说两点:

一是分配权限的问题。

默认情况下,Django会为每一个Model自动生成一add,delete,change的权限,并保存在auth_permission数据表中。

我们要想把权限分配给用户,就要用User的user_permissions属性。

对于超级用户来讲,他拥有所有的权限,并不需要再做分配。

2、模板中的权限变量

在setting.py中,我们定义了:

context_processor会自动添加一些上下文,当然,其中包括perms.源代码:

它添加了,user和perms两个变量,perms指的是当前用户的所有权限。 这样,在模板中,就可以使用perms变量了。

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 2 收藏 2 评论

关于作者:王海波

热爱Python,希望能一直做自己热爱的事! 个人主页 · 我的文章 · 13 ·     

相关文章

可能感兴趣的话题



直接登录
最新评论
  • hsfzxjy   2016/06/01

    最近喜欢用 django_rules 控制权限

  • gatspy   2016/08/07

    装饰器那块看着有点别扭,需要把func view和class view都先按照httpexception来划分吗?

    还有AuthorView的代码怎么会用get_queryset这种和model紧密结合的代码?

跳到底部
返回顶部