妙处在于装饰器的两个return
1.装饰器
# 使用闭包 def wrap(fun): def check(): print("正在检查用户权限!") fun() return check
2.实现
@wrap def fun(): print("执行这条语句需要时间!")
3.原理
使用装饰器相当于执行了下面几项操作: fun = wrap(fun) # wrap()的返回值check被fun引用,同时fun被check中引用。 fun() # 最终执行的是check,然后再check里面执行了原先fun放内容。
4.实例
def require_login(func): """ 需要登录 session中检查是否存在已登录的用户 """ def wrapper(request, *args, **kv): login_user = request.session.get(constants.SESSION_LOGIN_USER) # 访问的路径 # 没有登录,则跳转到 if login_user is None: return unauthorized_response(request.is_ajax(),None) return func(request, *args, **kv) return wrapper
from **.decorators import require_login @require_login def order_mng(request): pass