【问题标题】:Json jwt token problem - TypeError: Object of type 'User' is not JSON serializableJson jwt 令牌问题 - TypeError:“用户”类型的对象不是 JSON 可序列化的
【发布时间】:2020-09-23 18:58:08
【问题描述】:

我正在尝试将令牌附加到已登录的用户:

user_info = request.get_json()
entered_username = User.query.filter_by(username = user_info['username']).first()
        if user_info['password'] == entered_username.password:                                                                  
            token = jwt.encode({'username':entered_username, 'exp':datetime.datetime.utcnow() + datetime.timedelta(minutes=30)},
                               secret_key, algorithm='HS256').decode('UTF-8')
        return jsonify(token) 

但我得到:TypeError: Object of type 'User' is not JSON serializable. 我也试过return jsonify(token.decode('UTF-8'))

我错过了什么?

【问题讨论】:

  • 就是这么说的:您不能将User 对象编码为JSON,而entered_usernameUser 对象。如果您只想在令牌中使用用户名,请编码 {'username': user_info['username'], ...}
  • 你的意思是全部吗?我试过{'username': user_info['username'], ...}.decode('UTF-8') but then i get AttributeError: 'dict' object has no attribute 'decode'
  • 是的,省略号表示代码的其余部分,而不是字面上的 ...。我也不确定你为什么要在这里打电话给decode
  • 不,我指的是 {} 的其余部分或整个代码的其余部分。不是……哈哈。我得到同样的编码。

标签: python json flask jwt access-token


【解决方案1】:

您不能将 User 对象编码为 JSON,而 entered_usernameUser 对象。如果您只想要令牌中的用户名,您可以执行以下操作:

user_info = request.get_json()
user_obj = User.query.filter_by(username = user_info['username']).first()
if user_info['password'] == user_obj.password:
    claims = {
        'username': user_info['username'], # or perhaps user_obj.username
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
    }

    token = jwt.encode(claims, secret_key, algorithm='HS256')

    # Maybe some error checking here?

    response = {
        'token': token.decode()
    }

    return jsonify(response)

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2019-11-21
    • 2021-11-13
    • 2018-09-22
    • 2019-01-17
    相关资源
    最近更新 更多