python - 在 Flask 中使用 session 传递变量时出现关键错误

标签 python mysql json flask

我想在 Flask 应用程序中使用 session 将变量从函数传递到类。这是我的代码:

@app.route('/login', methods=['POST'])
def login():
    if not request.is_json:
        return jsonify({"msg": "Missing JSON in request"}), 400

    username = request.json.get('username', None)
    password = request.json.get('password', None)
    session['client_fname'] = request.json.get('Client First Name', None)
    session['client_lname'] = request.json.get('Client Last Name', None)

    ... ...

    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token), 200

class PrivateResource(Resource):
    @app.route('/protected', methods=['GET'])
    @jwt_required

    def sendData():
        return mysqldb.addUser("{}".format(session['client_fname']),"{}".format(session['client_lname']))

我要传递的变量是 session['client_fname']session['client_lname']。但是,当我尝试使用 curl -X GET http://localhost:5000/protected -H "Authorization: Bearer JWTGOESHERE" 触发 sendData() 我得到:

  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask_restful/__init__.py", line 273, in error_router
    return original_handler(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask_restful/__init__.py", line 273, in error_router
    return original_handler(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask_jwt_extended/view_decorators.py", line 101, in wrapper
    return fn(*args, **kwargs)
  File "/Users/open/PycharmProjects/FlaskMiddleware/Flask-API-Middleware-V1/authenticate.py", line 48, in sendData
    return mysqldb.addUser("{}".format(session['client_fname'],None),"{}".format(session['client_lname']))
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/werkzeug/local.py", line 377, in <lambda>
    __getitem__ = lambda x, i: x._get_current_object()[i]
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/sessions.py", line 83, in __getitem__
    return super(SecureCookieSession, self).__getitem__(key)
KeyError: 'client_fname'

我使用 session 传递变量的方式有什么问题?我该如何解决这个问题?

更新

如果这是与保留 session 有关的 cookie 问题,我该如何实现?现在我在 curl -H "Content-Type: application/json"-X POST -d '{"username":"user1","password":"abc123","Client First"中创建一个 cookie 文件Name":"SAUR","Client Last Name":"KRIS"}' http://localhost:5000/login -c cookies.txt 然后尝试 curl -X GET http://localhost:5000/protected -H "Authorization: Bearer JWTGOESHERE"-b cookies.txt.现在我收到了 TypeError: The view function did not return a valid response。该函数返回 None 或在没有返回语句的情况下结束。 我不确定这是进步还是完全错误。

最佳答案

您似乎正在使用 flask_jwt_extended,因此您可以通过将该数据直接存储在 token 中来绕过该问题。

# ...
access_token = create_access_token({
  'first_name': request.json.get('Client First Name', None),
  'last_name': request.json.get('Client Last Name', None)
})

然后在 protected 路由中检索它:

# ...
user_adata = get_jwt_identity()

关于python - 在 Flask 中使用 session 传递变量时出现关键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50748753/

相关文章:

c# - 序列化同一个类中的多个 DateTime 属性,每个属性使用不同的格式

python - 使用 Django : How to serve a file for download?

sql - 我怎样才能使这个 MySQL 查询工作?

c++ - Json输出成单行

php - 在 mysql 数据库中搜索结果包含部分匹配的字符串

php - 我的选择查询有什么问题?

javascript - 是否可以从存储在另一个 javascript 文件中的 JSON 对象读取值?

python - 请求库和http错误

python - 将与唯一标签相对应的值附加为 pandas 数据框中的值列表

python - 在 python txt 文件中打印特定列