设为首页 加入收藏

TOP

django-访问控制(一)
2017-09-30 17:43:46 】 浏览:7940
Tags:django- 访问 控制
django自带的用户认证系统提供了访问控制的的功能。
 
1.只允许登录的用户登录
 
django的用户可分为两类,一是可认证的用户,也就是在django.contrib.auth.models.User中注册了的;另一种是匿名用户 django.contrib.auth.models.AnonymousUser,每个访问的未登录的用户都是该类的一个实例,而匿名用户是无法认证的,即 is_authenticated 方法永远返回 False,或者 is_anonymous返回True,我们可以在代码逻辑中实现对匿名用户进行判断,然后拒绝其访问(403),或者重定向到登录页面等。
 
from django.conf import settings
from django.shortcuts import redirect

def my_view(request):
    if not request.user.is_authenticated:
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
    # ...

 

以上就是在代码中重定向到登录页面的做法,也可以返回错误信息:
 
from django.shortcuts import render

def my_view(request):
    if not request.user.is_authenticated:
        return render(request, 'myapp/login_error.html')
    # ...

 

由于这是一个常见的需求,所以django提供了一个装饰器来实现这个功能。
 
from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

 

 
这样大大的简化了工作。
 
  login_required(redirect_field_name='next', login_url=None) 
 
若用户没有登录的话, 其将无法访问被装饰的视图,而是重定向到登录页面,这个登录页面可以使用login_url参数指定,并且可以接受命名url的方式,如:@login_required(login_url='login'),当然前提是要有相应的命名的url。如果没有给定这个参数,将使用 settings.LOGIN_URL的值。
 
 
LOGIN_URL
Default: '/accounts/login/'
 
The URL where requests are redirected for login, especially when using the  login_required() decorator.
 
This setting also accepts  named URL patterns which can be used to reduce configuration duplication since you don’t have to define the URL in two places (settings and URLconf).
 
可以看见其有默认值,如果你不给参数,且登录地址不是这个默认值,将触发404错误,也就是还是重定向到那个页面去了,只是找不到而已。若强制重写为None,其会触发TypeError,若DEBUG=False,则应该是500系列的服务器错误。
 
但是,在重定向的时候,并不是单纯跳转,而是会带一个next查询参数例如:
 
 
 
这样你就可以获取登录前想要访问的页面(这里就是/account/change_info页面了),然后在登录后重定向回去,而不用盲目重定向到首页,用户体验会更好点。
 
下面就是登录视图中所做的配合:
 
next_to = request.GET.get('next', None)  # 获取是否有next的重定向,是一个相对路径,不含方案和域名
if next_to:
    return redirect(next_to)

 

当然你也可以改变redirect_field_name来改变next这个名称,当然在登录视图里也要做想要的调整,也可以将其设为None来取消附带参数的行为。
 
 
注意:login_required 并不会检查用户是否处于活跃状态(is_active),而处理用户登录的默认后台模板在1.10之前并不会拒绝非活跃用户登录,而1.10版本就会。这意味着如果你使用的版本低于1.10,你必须在代码逻辑中拒绝非活跃用户登录。
 
if user.is_active:  # 若用户是活跃的,即未冻结的,在1.10之前冻结用户默认也能登录,所以需要自己认证
    login(request, user)    # 登录
......    #其他处理
else:
    return HttpResponse('用户被冻结')

 

 
2.只允许staff身份的用户访问某个视图
 
django同样提供了一个便捷的装饰器来实现这个功能:
 
  staff_member_required(redirect_field_name='next', login_url='admin:login') 
 
 
可以看到其和上述的 login_required 参数上几乎一样,只是默认值有些许不同,而在用法上也是一样的,但并没有 settings.LOGIN_URL之类的设置层面上的退路。要注意一点,因为其默认是重定向至admin的登录页面,若要通过复杂化url的方式来隐藏入口的时候,要小心其会暴露该url。
 
This decorator is used on the admin views that require authorization. A view decorated with this function will having the following behavior:
这个装饰器已经被admin的视图所使用了,其行为如下:
 
 
 
  • If the user is logged in, is a st
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用Beautiful Soup编写一个爬虫 .. 下一篇Python(九) Python 操作 MySQL ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目