【问题标题】:Flask-jwt error with Flask-restful if request contain JSON如果请求包含 JSON,则 Flask-restful 的 Flask-jwt 错误
【发布时间】:2018-04-06 20:36:09
【问题描述】:

我正在使用Flask-restfulFlask-jwt 开发一个RESTful API。当我对任何端点使用 @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" 的第一个请求

【问题讨论】:

  • 能否提供一个示例flask文件进行调试?
  • 你能评论user = UserModel.find_by_id(user_id),然后再试一次,看看它是否有效?我刚刚创建了一个示例应用程序,我没有遇到这样的问题,所以很可能您在配置中也使用了其他东西
  • user 在这两种情况下都是None,并且在这一行没有发生异常。此外,当我在此行之后打印任何字符串时,它会正常打印。仅当请求中有 JSON 数据时才会出现此问题
  • 正如我所说,我创建了一个复制代码,它工作正常。所以你需要提供一个最小的 git repo 来重现问题
  • 你用过智威汤逊吗?此请求需要 JWT 令牌。如果我删除 JWT,它可以正常工作。

标签: python flask flask-restful flask-jwt


【解决方案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

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

【讨论】:

  • 非常感谢您的支持。我尝试升级到最新版本并添加了debug=True,我仍然得到No handlers could be found for logger "flask_jwt",我仍然在邮递员中得到Could not get any response,尽管服务器日志是正确的127.0.0.1 - - [03/Nov/2017 22:18:09] "PUT /customer/2 HTTP/1.1" 404 -
  • @Mohamed_AbdAllah,如果没有可重现的源代码,就无法调试问题。
猜你喜欢
  • 2022-11-11
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2014-11-04
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多