TypeError TypeError: 'NoneType' 对象不可调用

时间:2021-03-09 14:15:13

标签: python postman

我没有几天时间尝试找出下面失败(类型错误)的解决方案而没有运气。 出于某种原因,它在下面出现了这个错误,我找不到解决方案 或调试以便我知道出了什么问题。

把事情放在上下文中。我有一个正在运行的 app.py,它试图在 auth.py 中执行一些授权,并检查令牌的权限(我通过邮递员传递)

************************
TypeError
TypeError: 'NoneType' object is not callable

Traceback (most recent call last)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/ml_1/class-demos/Project_Fyyur/Files/Project_Fyyur-master/projects/capstone/starter_capstone_ml/starter/app.py", line 85, in <module>
@requires_auth('get:actors')
TypeError: 'NoneType' object is not callable
*********************************


**Auth.py**

#AUTH0_DOMAIN = os.getenv('AUTH0_DOMAIN')
AUTH0_DOMAIN = 'fsnd-ml-casting-agency.eu.auth0.com'
ALGORITHMS = ['RS256']
API_AUDIENCE = 'Casting'

## AuthError Exception
'''
AuthError Exception
A standardized way to communicate auth failure modes
'''
class AuthError(Exception):
    def __init__(self, error, status_code):
        self.error = error
        self.status_code = status_code

def get_token_auth_header():
        auth = request.headers.get('Authorization', None)
        print(auth)
        if not auth:
            raise AuthError({
                'code': 'authorization_header_missing',
                'description': 'Authorization header is expected.'
            }, 401)

        parts = auth.split()
        if parts[0].lower() != 'bearer':
            raise AuthError({
                'code': 'invalid_header',
                'description': 'Authorization header must start with "Bearer".'
            }, 401)

        elif len(parts) == 1:
            raise AuthError({
                'code': 'invalid_header',
                'description': 'Token not found.'
            }, 401)

        elif len(parts) > 2:
            raise AuthError({
                'code': 'invalid_header',
                'description': 'Authorization header must be bearer token.'
            }, 401)

        token = parts[1]
        return token

def verify_decode_jwt(token):
    jsonurl = urlopen(f'https://{AUTH0_DOMAIN}/.well-known/jwks.json')
    jwks = json.loads(jsonurl.read())
    unverified_header = jwt.get_unverified_header(token)
    rsa_key = {}
    #print("jwsks",jwks)
    for key in jwks["keys"]:
        if key["kid"] == unverified_header["kid"]:
            rsa_key = {
                "kty": key["kty"],
                "kid": key["kid"],
                "use": key["use"],
                "n": key["n"],
                "e": key["e"]
            }
           
    if rsa_key:
        try:
            payload = jwt.decode(
                token,
                rsa_key,
                algorithms=ALGORITHMS,
                audience=API_AUDIENCE,
                issuer="https://"+AUTH0_DOMAIN+"/"
            )
            return payload

        except jwt.ExpiredSignatureError:
            raise AuthError("token has expired", 401)
        except jwt.JWTClaimsError:
            raise AuthError("invalid claims (Error): check the audience", 401)
        except Exception:
            raise AuthError("invalid header: Unable to parse token", 401)

    print("rsa_key",rsa_key)     
    raise AuthError("invalid header: Unable to find right key", 401)

    def requires_auth(permission=''):
        def requires_auth_decorator(f):
            #print(permission)
            @wraps(f)
            def wrapper(*args, **kwargs):
                try:
                    token = None
                    if session['token']:
                        token = session['token']
                    else:
                        token = get_token_auth_header()
                    print('token at authorization time: {}'.format(token))
                    if token is None:
                        abort(400)
                    payload = verify_decode_jwt(token)
                    print('Payload is: {}'.format(payload))
                    print(f'testing for permission: {permission}')
                    if check_permissions(permission, payload):
                    print('Permission is in permissions!')
                    
                    return f(payload, *args, **kwargs)
                except Exception:
                    abort(401)
    
    
            return wrapper
        return requires_auth_decorator 
    **End Auth.py**
#  Actors
#  ----------------------------------------------------------------
# route handler to get list of actors
        @app.route('/actors', methods = ['GET'])
@cross_origin()
@requires_auth('get:actors')
def list_actors(payload):
#def get_actors():
    #auth_header = request.headers['Authorization']
    #print ("Aut_header:", auth_header)
    #header_parts =  auth_header.split(' ') [1]
    #print("header_part", header_parts)
    # payload_data = check_permissions('permission','payload')
    # print("payload_data-1111", payload_data)
    token_data = requires_auth('token')
    print("token_data", token_data)
    #decorator_data = requires_auth('requires_auth_decorator')
    decorator_data = requires_auth('f')
    print("dec_data"), decorator_data
    actors = Actor.query.all()
    actors_data = []
    for actor in actors:
        actors_data.append({
            "id": actor.id,
            "name": actor.name,
            "age": actor.age,
            "gender": actor.gender,
            "image_link": actor.image_link
            })
        result = actors_data    

    return jsonify(result)

1 个答案:

答案 0 :(得分:0)

它似乎找不到装饰器函数 requires_auth,这可能是由于 Auth.py 被导入到 app.py 的方式

试试这个

  1. Auth.py的内容直接复制到app.py
  2. 再次运行代码,看看问题是否消失

您还有一个装饰器 cross_origin,它在您的示例代码中不可见。确保它没有覆盖其他东西

3 月 11 日更新

  1. 试试import Auth,然后你就可以做到@Auth.requires_auth