【问题标题】:Flask_restx @api.route return statement results in a TypeErrorFlask_restx @api.route return 语句导致 TypeError
【发布时间】:2020-07-16 08:38:13
【问题描述】:

我有一个我无法解决的问题。我想在烧瓶中使用 http cookie。这是文档中的代码:

@app.route('/token/auth', methods=['POST'])
def login():
    username = request.json.get('username', None)
    password = request.json.get('password', None)
    if username != 'test' or password != 'test':
        return jsonify({'login': False}), 401

    # Create the tokens we will be sending back to the user
    access_token = create_access_token(identity=username)
    refresh_token = create_refresh_token(identity=username)

    # Set the JWT cookies in the response
    resp = jsonify({'login': True})
    set_access_cookies(resp, access_token)
    set_refresh_cookies(resp, refresh_token)
    return resp, 200

我使用 flask_restx 自动将响应转换为 JSON,因此不需要第一个示例中的 jsonify。但是,仍然需要对其进行 jsonify,因为我不能在字典上使用set_access_cookie。这最终会导致像这样的嵌套响应 jsonify(jsonify(x))

@api.route("/login")
class UserLogin(Resource):
    def post(self):
        """Allows a new user to login with his email and password"""

        email = request.get_json()["email"]
        password = request.get_json()["password"]

        user = User.query.filter_by(email=email).one_or_none()

        if user is None:
            return {"message": "user does not exist"}, 404

        user = user.format()
        if bcrypt.check_password_hash(pw_hash=user["password"], password=password):

            if user["active"]:
                resp = jsonify({"login": True})
                access_token = create_access_token(identity=user)
                refresh_token = create_refresh_token(user)
                set_access_cookies(resp, access_token)
                set_refresh_cookies(resp, refresh_token)
                return resp, 200
                # return (
                #     {"access_token": access_token, "refresh_token": refresh_token},
                #     200,
                # )

            else:
                return {"message": "User not activated"}, 400

        else:
            return {"message": "Wrong credentials"}, 401

这是错误:TypeError: Object of type Response is not JSON serializable

有什么办法可以克服这个问题吗?

【问题讨论】:

  • 你能显示user.format()的结果吗?
  • 已解决,但非常感谢您的关注 :-)

标签: flask flask-restplus jsonify


【解决方案1】:

能够像这样解决它:

data = dict(login=True)
resp = make_response(jsonify(**data), 200)
access_token = create_access_token(identity=user)
refresh_token = create_refresh_token(user)
set_access_cookies(resp, access_token)
set_refresh_cookies(resp, refresh_token)
return resp

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 2017-02-05
    • 2019-10-02
    • 1970-01-01
    • 2022-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2017-11-04
    相关资源
    最近更新 更多