我没有几天时间尝试找出下面失败(类型错误)的解决方案而没有运气。 出于某种原因,它在下面出现了这个错误,我找不到解决方案 或调试以便我知道出了什么问题。
把事情放在上下文中。我有一个正在运行的 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)
答案 0 :(得分:0)
它似乎找不到装饰器函数 requires_auth
,这可能是由于 Auth.py
被导入到 app.py
的方式
试试这个
Auth.py
的内容直接复制到app.py
中您还有一个装饰器 cross_origin
,它在您的示例代码中不可见。确保它没有覆盖其他东西
3 月 11 日更新
import Auth
,然后你就可以做到@Auth.requires_auth