Я работаю на сервере Flask, где у нас есть маршрут для проверки токена JWT пользователя с использованием библиотеки flask-jwt-extended .Вот как выглядит наш маршрут:
from flask_jwt_extended import (
JWTManager, jwt_required, create_access_token, create_refresh_token, get_jwt_identity, jwt_refresh_token_required
)
@app.route('/api/users/validate', methods=['POST'])
def validate_user():
if not request.json:
abort(400)
data = request.get_json()
if ('id_token' not in data):
abort(400, "id_token must be a parameter in the JSON")
decoded_token = auth.verify_id_token(data['id_token'])
if ('uid' not in decoded_token):
return json.dumps({'verified': False}), 200
else:
user = mongo.db.users.find_one({'_id': decoded_token['uid']})
if user:
access_token = create_access_token(identity=user['_id'])
refresh_token = create_refresh_token(identity=user['_id'])
return json.dumps({'verified': True, 'access_token': access_token, 'refresh_token': refresh_token}), 200
else:
return json.dumps({'verified': False, 'message': 'unable to locate user'}), 401
По какой-то причине, когда я пытаюсь отправить запрос на этот маршрут, я получаю ошибку TypeError: 'module' object is not callable
для функции create_access_token
.Вот трассировка стека:
127.0.0.1 - - [08/May/2019 12:24:17] "POST /api/users/validate HTTP/1.1" 500 -
Traceback (most recent call last):
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/user/Documents/server/src/controllers/auth_controller.py", line 44, in validate_user
access_token = create_access_token(identity=user['_id')
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask_jwt_extended/utils.py", line 157, in create_access_token
return jwt_manager._create_access_token(identity, fresh, expires_delta, user_claims)
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask_jwt_extended/jwt_manager.py", line 476, in _create_access_token
json_encoder=config.json_encoder
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask_jwt_extended/tokens.py", line 77, in encode_access_token
json_encoder=json_encoder)
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/flask_jwt_extended/tokens.py", line 31, in _encode_jwt
json_encoder=json_encoder).decode('utf-8')
File "/Users/user/Documents/server/venv/lib/python3.6/site-packages/jwt/api_jwt.py", line 61, in encode
cls=json_encoder
File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
TypeError: 'module' object is not callable
Я трижды проверил документы на расширенные фляги-jwt, и create_acess_token
, фактически, является функцией, и при печати create_acess_token
она печатает, что это функция.Я просмотрел почти все сообщения StackOverflow на эту тему, и ни одна из них не была полезной - большинство из них рассказывают о пользовательских классах, но эту функцию я извлекаю из внешней библиотеки.
Вот определение create_access_token
в flask-jwt-extended:
def _create_access_token(self, identity, fresh=False, expires_delta=None, user_claims=None):
if expires_delta is None:
expires_delta = config.access_expires
if user_claims is None:
user_claims = self._user_claims_callback(identity)
access_token = encode_access_token(
identity=self._user_identity_callback(identity),
secret=self._encode_key_callback(identity),
algorithm=config.algorithm,
expires_delta=expires_delta,
fresh=fresh,
user_claims=user_claims,
csrf=config.csrf_protect,
identity_claim_key=config.identity_claim_key,
user_claims_key=config.user_claims_key,
json_encoder=config.json_encoder
)
return access_token
Если это помогает, код находится на Python 3.6.5 и находится в виртуальной среде.Любая помощь будет принята с благодарностью!