首先来分析下需求,web程序后台需要认证,后台页面包含多个页面,最普通的方法就是为每个url添加认证,但是这样就需要每个每个绑定url的后台函数都需要添加类似或者相同的代码,但是这样做代码就过度冗余,而且不利于扩展.
接下来我们先不谈及装饰器,我们都知道Python是个很强大的语言,她可以将函数当做参数传递给函数,最简单的:
def p(): print 'Hello,world' def funcfactor(func): print 'calling function named', func.__name__ func() print 'end' funcfactor(p) # 输出为: # calling function named p # Hello,world # end
一目了然的程序,定义一个函数p(),将函数p当做参数传递给喊出funcfactor,在执行p函数前后加上一些动作.
我们还可以这么做:
def p(): print 'Hello,world' def funcfactor(func): print 'calling function named', func.__name__ return func func = funcfactor(p) func() # 输出为: # calling function named p Hello,world
正如你看到的,我们可以将函数返回然后赋予一个变量,留待稍后调用.但是这种情况下我们要想在函数执行后做点什么就不可能,但是我们的Python是强大的,Python可以在函数中再嵌套一个函数,我们可以像下面这么做:
def p(): print 'Hello, world' def funcfactor(func): def wrapper(): print 'do something at start' func() print 'do something at end' return wrapper func = funcfactor(p) func() #输出为: # do something at start # Hello, world # do something at end
下面我们来看看装饰器,上面的代码虽然实现的一个很困难的任务,但是还不够优雅,而且代码不符合Python的哲学思想,所以装饰器就应声而出,装饰器没有和上面的原理相同,同样用于包装函数,只是代码实现上更加优雅和便于阅读.装饰器以@开头后面跟上装饰器的名称,紧接着下一行就是要包装的函数体,上面的例子用装饰器可用如下方式实现:
def decorator(func): def wrapper(): print 'do something at start' func() print 'do something at end' return wrapper @decorator def p(): print 'Hello, world' p() #输出为: # do something at start # Hello, world # do something at end
实际上装饰器并没有性能方面或其他方面的提升,仅仅是一种语法糖,就是上面一个例子的改写,这样更加优雅和便与阅读. 如果我们的p()函数不想仅仅只输Hello,world,我们想向某些我们指定的人打招呼:
def decorator(func): def wrapper(*args, **kargs): print 'do something at start' func(**kargs) print 'do something at end' return wrapper @decorator def p(name): print 'Hello', name p(name="Jim") #输出为: # do something at start # Hello Jim # do something at end
装饰器在装饰不需要参数的装饰器嵌套函数不是必须得,如果被装饰的函数需要参数,必须嵌套一个函数来处理参数. 写到这里想必大家也知道装饰器的用法和作用.现在回到正题,如何优雅的给后台url加上验证功能?毫无疑问我们使用装饰器来处理:
def blog_auth(func): ''' 定义一个装饰器用于装饰需要验证的页面 装饰器必须放在route装饰器下面 ''' # 定义包装函数 def wrapper(*args, **kargs): try: # 读取cookie user = request.COOKIES['user'] shell = request.COOKIES['shell'] except: # 出现异常则重定向到登录页面 redirect('/login') # 验证用户数据 if checkShell(user, shell): # 校验成功则返回函数 return func(**kargs) else: # 否则则重定向到登录页面 redirect('/login') return wrapper
可以再需要验证的地方添加blog_auth装饰器:
@route('/admin:#/?#') @blog_auth def admin(): ''' 用于显示后台管理首页 ''' TEMPLATE['title'] = '仪表盘 | ' + TEMPLATE['BLOG_NAME'] TEMPLATE['user'] = request.COOKIES['user'] articles = [] for article in db.posts.find().sort("date",DESCENDING).limit(10): articles.append(article) # 将文章列表交给前台模版 TEMPLATE['articles'] = articles return template('admin.html',TEMPLATE)
至此bottle验证的问题就很优雅的用装饰器解决了.
本文向大家介绍Python使用装饰器模拟用户登陆验证功能示例,包括了Python使用装饰器模拟用户登陆验证功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python使用装饰器模拟用户登陆验证功能。分享给大家供大家参考,具体如下: 运行结果: 更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python编码操作技巧总结》、《Python
本文向大家介绍Python实现带参数的用户验证功能装饰器示例,包括了Python实现带参数的用户验证功能装饰器示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现带参数的用户验证功能装饰器。分享给大家供大家参考,具体如下: 运行结果: {'username': None, 'login': False} filedb 一脸蒙蔽的验证方式 欢迎来到主页 {'username'
本文向大家介绍python中的装饰器详解,包括了python中的装饰器详解的使用技巧和注意事项,需要的朋友参考一下 在了解装饰器的之前一定要先了解函数作为参数传递, 什么是函数内嵌,请参考我之前写的博客函数简介 因为在python里面,函数也是对象,也可以作为参数进行传递.python装饰器本质也是一种特殊函数,它接收的参数是函数对象,然后动态地函数参数添加额外的功能,而不用修改原有的函数对象.p
用户验证(User Authentification)复合的使用Play框架的数个功能,包括前面已经了解的表单和数据库,以及这篇文章里要提到的加密和会话。根据应用或站点的复杂程度,用户验证也可以随之变化。这里将介绍用户验证的一个基本实现方式。 加密 为了信息安全,用户密码需要加密,而不是保存为明文。Bcrypt算法可以对明文密码进行哈希(Hash)转换。我保存在数据库中的密码,是经过转换后的文本。
本文向大家介绍在Python的Bottle框架中使用微信API的示例,包括了在Python的Bottle框架中使用微信API的示例的使用技巧和注意事项,需要的朋友参考一下 微信这个东西估计宅男没几个不熟悉的吧,微信经过这么两年多的发展终于向开放平台跨出了友好的一步。蛋疼的以为微信会出一个详细的api等接口,兴奋不已的去申请了微信公共平台,然后开始找各种api的位置…… 花费了近一个小时,依然没找到
本文向大家介绍深入理解Python中装饰器的用法,包括了深入理解Python中装饰器的用法的使用技巧和注意事项,需要的朋友参考一下 因为函数或类都是对象,它们也能被四处传递。它们又是可变对象,可以被更改。在函数或类对象创建后但绑定到名字前更改之的行为为装饰(decorator)。 “装饰器”后隐藏了两种意思——一是函数起了装饰作用,例如,执行真正的工作,另一个是依附于装饰器语法的表达式,例如,at