呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

Django 自定义装饰器进行登录访问限制

前言

我们在设计网站用户系统的时候,往往需要进行登录访问限制,比如说用户还没有登录的时候,有些网页是不能访问的。

最简单粗暴的办法是,在每个页面的函数最开始加一个 登录验证函数,检查当前用户登录状态:如果已经登陆过,那么继续往下执行;如果用户还没登录,对不起,出门左转到登录页。

在 python 中有个优雅的解决办法——使用 装饰器。Django 中有提供使用装饰器进行登录访问限制的方法,详情可见 django实现用户登陆访问限制@login_required,如果对自己实现这套机制感兴趣的童靴,可以继续往下看。

装饰器

首先简单介绍一下装饰器,装饰器相当于在一个函数外面又套了一层函数,将原函数集成到一段新的代码中,执行的时候直接运行外面这层函数,这样做的优点是可以动态扩展函数的功能。

装饰器在 python 中的用法十分简单,外层函数放在原函数前,加@表示:

@work
def foo(a,b):
    ......

将装饰器用于登录验证

上节中可以看出,装饰器的使用十分简单和优雅。在用户系统中,我们可以把 登录验证函数 作为装饰器放在每一个页面的函数前面。

首先 定义装饰器,装饰器其实也是一个函数,只不过 它把一个函数作为参数传进来,返回了另一个替换函数。在这里装饰器的作用是检查登录状态,如果已经登录,运行原函数,如果未登录,跳转到登录页。

def my_login_required(func):
    '''自定义 登录验证 装饰器'''
    def check_login_status(request):
        '''检查登录状态'''
        if request.session.has_key('user_id'):
            # 当前有用户登录,正常跳转
            return func(request)
        else:
            # 当前没有用户登录,跳转到登录页面
            return HttpResponseRedirect('/login')
    return check_login_status

使用装饰器就简单了,把装饰器函数加到需要访问限制的页面函数之前即可:

@my_login_required
def index(request):
    '''主页'''
    .......
    return render(request,'index.html',locals())

如此,在渲染主页之前,需要先进入装饰器 my_login_required 中验证登录状态,如果已经登录,才可以访问主页,否则,跳转到登录页面。

参考资料

  • 简单 12 步理解 Python 装饰器
    http://python.jobbole.com/85056/

  • django实现用户登陆访问限制@login_required
    http://blog.51cto.com/alsww/1732435

  • COOKIE和SESSION有什么区别?
    https://www.zhihu.com/question/19786827

  • 04.Django实现完整登录系统的两种方法(cookie and session)
    http://blog.csdn.net/gamer_gyt/article/details/50335637

  • 浅谈django中的认证与登录
    http://www.jb51.net/article/96110.htm

原创声明

转载请注明:呓语 » Django 自定义装饰器进行登录访问限制