Python 如果请求包含JSON,则Flask jwt错误与Flask restful

Python 如果请求包含JSON,则Flask jwt错误与Flask restful,python,flask,flask-restful,flask-jwt,Python,Flask,Flask Restful,Flask Jwt,我正在使用flaskrestful和flaskjwt开发一个restfulapi。当我对任何端点使用@jwt_required()并发送包含JSON数据的请求时,我不会收到我指定的错误消息JSON。如果我删除了JSON数据,请求就会得到正确处理 代码如下: @jwt_required() def put(self, user_id): user = UserModel.find_by_id(user_id) if user is None: ret

我正在使用
flaskrestful
flaskjwt
开发一个restfulapi。当我对任何端点使用
@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()
更新


我发现在第一个请求的记录器“flask_jwt”中找不到处理程序,因此我以不同的可能组合运行了此操作,无法复制此问题。在服务器文件下面输入用户

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()
然后在POSTMAN中,所有请求都可以工作,无论是否发送JSON

没有身体

有身体的

这可能与某些软件包版本问题有关。我建议你跑步

pip install flask-jwt flask-restful --force --upgrade

获取最新版本并查看是否解决了问题。如果没有,请尝试在您的
应用程序中运行
debug=True
。run()

您可以提供一个用于调试的示例烧瓶文件吗?您是否可以对
user=UserModel进行注释。通过\u id(user\u id)
查找\u,然后重试,看看它是否有效?我刚刚创建了一个示例应用程序,我没有遇到这样的问题,所以在这两种情况下,很可能您在配置中也使用了其他东西
user
is
None
,并且在这一行中没有异常发生。另外,当我打印这行之后的任何字符串时,它都是正常打印的。只有当请求中有JSON数据时,问题才会发生,正如我所说,我创建了一个要复制的代码,它可以正常工作。因此,您需要提供最低限度的git回购来复制您使用JWT的发行ID?此请求需要JWT令牌。如果我删除JWT,它可以正常工作。我非常感谢您的支持。我尝试升级到最新版本并添加了
debug=True
,我仍然得到
没有找到记录器“flask_jwt”的处理程序
,我仍然得到
无法在Postman中得到任何响应
,尽管服务器日志是正确的
127.0.0.1---[03/Nov/2017 22:18:09]“PUT/customer/2 HTTP/1.1”404-
@Mohamed_AbdAllah,如果没有可复制的源代码,则无法调试问题。
pip install flask-jwt flask-restful --force --upgrade