Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Flask中的会话传递变量时出现键错误_Python_Mysql_Json_Flask - Fatal编程技术网

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()
尝试使用python
requests
库,而不是直接使用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这是一个非常好的测试工具,我也认为这是一个状态问题