Python 使用Flask中的会话传递变量时出现键错误
我想使用Python 使用Flask中的会话传递变量时出现键错误,python,mysql,json,flask,Python,Mysql,Json,Flask,我想使用会话将变量从函数传递到Flask应用程序中的类。这是我的代码: @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 = requ
会话
将变量从函数传递到Flask应用程序中的类。这是我的代码:
@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\u fname']
和session['client\u fname']
。但是,当我尝试使用curl-xget触发sendData()http://localhost:5000/protected -H“授权:持证人JWTGOESHERE”
我得到:
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'
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第2309行,在调用中__
返回self.wsgi_应用程序(环境,启动响应)
wsgi_应用程序中的文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第2295行
response=self.handle\u异常(e)
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask_restful/_init__.py”,第273行,错误
返回原始处理程序(e)
handle_异常中的文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第1741行
重放(exc_类型、exc_值、tb)
wsgi_应用程序中的文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第2292行
response=self.full\u dispatch\u request()
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第1815行,完整发送请求
rv=自身处理用户异常(e)
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask_restful/_init__.py”,第273行,错误
返回原始处理程序(e)
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第1718行,在handle\u user\u异常中
重放(exc_类型、exc_值、tb)
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第1813行,完整发送请求
rv=自我分派请求()
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/app.py”,第1799行,在调度请求中
返回self.view_函数[rule.endpoint](**req.view_参数)
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask\u jwt\u extended/view\u decorators.py”,第101行,在包装器中
返回fn(*args,**kwargs)
文件“/Users/open/PycharmProjects/FlaskMiddleware/Flask-API-Middleware-V1/authenticate.py”,第48行,在sendData中
返回mysqldb.addUser(“{}.format(会话['client\u fname'],无),“{}.format(会话['client\u fname']))
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/werkzeug/local.py”,第377行,在
__getitem\uuuu=lambda x,i:x.\u获取\u当前\u对象()[i]
文件“/Users/open/venv/FlaskMiddleware/lib/python2.7/site packages/flask/sessions.py”,第83行,在__
返回super(SecureCookieSession,self)。\uu获取项目\uuuu(键)
KeyError:“客户端名称”
我使用session
传递变量的方式有什么问题?我怎样才能解决这个问题
更新
如果这是一个与保存会话有关的cookie问题,我如何才能做到这一点?现在我正在curl-H“Content Type:application/json”-X POST-d'{“username”:“user1”,“password”:“abc123”,“Client First Name”:“SAUR”,“Client Last Name”:“KRIS”}中创建一个cookie文件http://localhost:5000/login -c cookies.txt
然后尝试curl-X GEThttp://localhost:5000/protected -H“授权:持证人JWTGOESHERE”-b cookies.txt
。现在我得到了TypeError:view函数没有返回有效的响应。函数要么返回None,要么结束时没有返回语句。
我不确定这是进度还是完全错误 您几乎肯定没有在请求之间保留状态。如果您使用的是postman或curl,请确保保存会话id cookie。如果您使用的是请求
使用请求.session()
您的更新看起来可能正在进行中,但可能mysqldb.addUser函数没有返回任何结果
确定是否取得进展的最简单方法是在返回mysqldb.addUser(“{}.format(session['client\u fname'),“{}.format(session['client\u lname'))
行中使用断点进行调试(我通常使用PyCharm进行调试,但大多数IDE都有用于调试的内容,或者您可以使用pdb)。一个更快但更复杂的选项是,在调用mysqldb.addUser之前添加一个print语句,然后再添加一个print语句来打印返回值 您似乎正在使用flask\u jwt\u extended
,因此您可以通过将数据直接存储在令牌中来绕过这个问题
# ...
access_token = create_access_token({
'first_name': request.json.get('Client First Name', None),
'last_name': request.json.get('Client Last Name', None)
})
然后在受保护的
路径中检索它:
# ...
user_adata = get_jwt_identity()
您是否在客户端跟踪会话cookie?可能您以前也通过curl调用了login
。在调用curl时,你在做什么来保存会话?@DanielRoseman对。保留会话是指有一个指向各种cookie文件的文件路径吗?是的,看起来您的会话没有保留。您可以通过使用requests.session()
尝试使用pythonrequests
库,而不是直接使用cURL。作为我在类似情况下如何使用它的示例,您使用的是什么扩展?由于create\u access\u token
功能,我假设是flask\u jwt\u extended
,但我宁愿确定。我一直在谷歌上搜索如何在curl中实现这一点。我必须编辑我的flask代码吗?还是通过curl命令来编辑,比如curl--cookie“session=“
”?使用curl--cookie jar.txt代码>就像他们在这里做的那样:即卷曲http://url.com/login --cookie jar cookies.txt&&curlhttp://url.com/protected --cookie cookies.txt
使用postman这是一个非常好的测试工具,我也认为这是一个状态问题