今天看代码时候有这么一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from functools import wraps
def http_basic_auth(func):
'''定义httpbasicauth装饰器'''
@wraps(func)
def _decorator(request, *args, **kwargs):
authorization = request.META.get('HTTP_AUTHORIZATION','')
if authorization:
authmeth, auth = authorization.split(' ', 1)
if authmeth.lower() == 'basic':
auth = auth.strip().decode('base64')
username, password = auth.split(':', 1)
user = authenticate(username=username, password=password)
if user and user.is_superuser:
login(request, user)
return func(request, *args, **kwargs)
return HttpResponseForbidden()
return _decorator

作用就是为django实现http认证的装饰器,并且使用超级管理员才可以使用被装饰的接口。至于什么是装饰器、闭包、作用域这里就不多说了,有兴趣的可以参考http://www.imooc.com/learn/581 讲解的非常详细。

那么,这个函数中的@wraps(func)又是做什么的呢?这里就涉及到了装饰器的一个小细节问题:被装饰后的函数本质上已经不是原来的函数了,所以原函数的某些信息比如:__name____doc__等值就变了。而@wraps()的作用就是把原函数的相关信息代入到新的函数中。