关于functools.wraps的作用

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

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()的作用就是把原函数的相关信息代入到新的函数中。