【发布时间】:2015-03-22 10:00:26
【问题描述】:
在我的遗留代码中,我发现了两种编写视图装饰器的方法。 第一个:
def require_session(f):
def wrap(request, *args, **kwargs):
if not 'username' in request.session:
messages.warning(request,_('You have to login first before you can access this page.'))
return redirect('/login')
return f(request, *args, **kwargs)
wrap.__doc__=f.__doc__
wrap.__name__=f.__name__
return wrap
第二个:
def require_role(role):
def decorator(func):
def inner_decorator(request,*args, **kwargs):
user_role = request.session.get('role','user')
if user_role != role:
if user_role == 'user':
return redirect('/dashboard')
else:
return redirect('/dashboard/list_users')
return func(request, *args, **kwargs)
return wraps(func)(inner_decorator)
return decorator
哪个更好,更“pythonic”? 或者也许我应该用完全不同的方式来写它?你写装饰器的方式是什么?
【问题讨论】:
标签: python django python-decorators