Flask-jwt ошибка с Flask-restful, если запрос содержит JSON
Я разрабатываю RESTful API, используя Flask-restful
а также Flask-jwt
, Когда я использую @jwt_required()
для любой конечной точки, и я отправляю запрос, содержащий данные JSON, я не получаю сообщение об ошибке JSON, которое я указываю. Если я удаляю данные JSON, запрос обрабатывается правильно.
Вот код:
@jwt_required()
def put(self, user_id):
user = UserModel.find_by_id(user_id)
if user is None:
return {"message": "User not found!"}, 404
Вот запрос почтальона:
PUT /user/2 HTTP/1.1
Host: 127.0.0.1:5000
Content-Type: application/json
Authorization: JWT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Cache-Control: no-cache
{
"backdrop_image": "Sora"
}
И журнал сервера:
2017-10-25 18:31:06,256 INFO sqlalchemy.engine.base.Engine (2, 1, 0)
2017-10-25 18:31:06,259 INFO sqlalchemy.engine.base.Engine ROLLBACK
127.0.0.1 - - [25/Oct/2017 18:31:06] "PUT /user/2 HTTP/1.1" 404 -
Если я удалю JSON:
PUT /user/2 HTTP/1.1
Host: 127.0.0.1:5000
Content-Type: application/json
Authorization: JWT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Cache-Control: no-cache
Я получаю ожидаемый ответ:
{
"message": "User not found!"
}
Вот вызываемый метод:
@classmethod
def find_by_id(cls, _id):
return cls.query.filter_by(id = _id).first()
Обновить
Я узнал, что я получаю No handlers could be found for logger "flask_jwt"
за 1-й запрос
1 ответ
Таким образом, я выполнил это в другой возможной комбинации, и проблема не может быть повторена. Я пользователь ниже файла сервера
from flask import Flask
from flask_jwt import JWT, jwt_required, current_identity
from flask_restful import Api, Resource
from werkzeug.security import safe_str_cmp
class User(object):
def __init__(self, id, username, password):
self.id = id
self.username = username
self.password = password
def __str__(self):
return "User(id='%s')" % self.id
users = [
User(1, 'xyz', 'xyz'),
User(2, 'user2', 'abcxyz'),
]
username_table = {u.username: u for u in users}
userid_table = {u.id: u for u in users}
def authenticate(username, password):
user = username_table.get(username, None)
if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')):
return user
def identity(payload):
user_id = payload['identity']
return userid_table.get(user_id, None)
app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'super-secret'
jwt = JWT(app, authenticate, identity)
api = Api(app)
class HelloWorld(Resource):
@jwt_required()
def get(self, user_id):
return {'hello': 'world'}
@jwt_required()
def put(self, user_id):
user = None
if user is None:
return {"message": "User not found!"}, 404
api.add_resource(HelloWorld, '/<string:user_id>')
if __name__ == '__main__':
app.run()
requirements.txt
aniso8601==1.3.0
click==6.7
Flask==0.12.2
Flask-JWT==0.3.2
Flask-RESTful==0.3.6
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe==1.0
PyJWT==1.4.2
python-dateutil==2.6.1
pytz==2017.2
six==1.11.0
Werkzeug==0.12.2
И тогда в POSTMAN все запросы работают независимо от того, отправлен ли JSON или нет
Это может быть связано с проблемой версии пакета. Я хотел бы предложить вам бежать
pip install flask-jwt flask-restful --force --upgrade
Чтобы получить последние версии и посмотреть, решит ли это проблему. Если нет, то попробуйте запустить с debug=True
в вашем app.run()