Jquery 从Flask会话检索值时出现KeyError
我有一个Flask应用程序,它在数据库中存储一些值。这些来自HTML表单。其中一些将使用以下代码添加到Flask的会话中:Jquery 从Flask会话检索值时出现KeyError,jquery,ajax,python-3.x,session,flask,Jquery,Ajax,Python 3.x,Session,Flask,我有一个Flask应用程序,它在数据库中存储一些值。这些来自HTML表单。其中一些将使用以下代码添加到Flask的会话中: session['userID']=str(cur_var.getvalue()) 我有一个调试HTML页面,只显示当前会话中存储的内容。呈现此页面的代码如下所示: @app.route('/debug/') def debug(): return str(session) 一旦我打开这一页 <securecookiesession {'usercoord'
session['userID']=str(cur_var.getvalue())
我有一个调试HTML页面,只显示当前会话中存储的内容。呈现此页面的代码如下所示:
@app.route('/debug/')
def debug():
return str(session)
一旦我打开这一页
<securecookiesession {'usercoord': 7.0,'userid': '53.0'}></securecookiesession>
此外,我还制作了一个非常简单的网页,只需打印会话['userID']
。我在Flask应用程序中使用以下代码:
@app.route('/print/')
def printing():
return render_template('print.html', printing=session['userid'])
这是print.html模板:
{% extends "layout.html" %}
{% block content %}
{{ printing }}
{% endblock %}
这会产生以下错误:
<title>KeyError: 'userid' // Werkzeug Debugger</title>
builtins.KeyError
KeyError: 'userid'
我已经在一个小得多的应用程序上尝试了同样的逻辑,并且效果很好。我的错误在哪里
非常感谢您能提供的任何帮助
附言。
如果有任何用处,我将使用jQuery处理网页和Flask应用程序之间的交互,并使用AJAX发布数据
更新
在重新设计项目以将其简化为一个更简单的项目之后,我发现有时(出于我不理解的原因),向Flask会话添加新的值将不起作用。例如,如果我包括这行代码:
session['coordid']=float(cur_var.getvalue())
在我的print.html页面中查看
str(session)
,我看不到键coordid
,问题与AJAX的异步性有关。如果您调用两个不同的jQuery函数,每个函数都带有一个AJAX调用,那么很可能有一个函数会请求尚未处理的数据
在本例中,您有一个进行AJAX调用的函数,Python会捕获该函数。Python应用程序从调用中获取数据并将其存储到数据库中。同时,Python还负责另一个AJAX调用。但是,由于并非所有信息都已在第一次调用中完成处理,因此您会得到keyrerror
我尝试了几种方法来解决这个问题:
- 使用回调;然而,正如Lazaris(2012)在他的文章中所指出的,“如果函数包含某种异步执行(如Ajax调用或动画),那么回调将在异步操作开始后执行,但可能在异步操作完成之前执行。”
- 调用AJAX成功回调中的第二个函数,但这不起作用
- 最后,解决方案是在Python应用程序中添加以下代码。在执行依赖于添加到会话的值的函数之前,请检查此值是否存在:
count=1000 而不是会话['coordid']和计数: 计数-=1
- 问题在于AJAX是如何异步的。如果您调用两个不同的jQuery函数,每个函数都带有一个AJAX调用,那么很可能有一个函数会请求尚未处理的数据
在本例中,您有一个进行AJAX调用的函数,Python会捕获该函数。Python应用程序从调用中获取数据并将其存储到数据库中。同时,Python还负责另一个AJAX调用。但是,由于并非所有信息都已在第一次调用中完成处理,因此您会得到
keyrerror
我尝试了几种方法来解决这个问题:
- 使用回调;然而,正如Lazaris(2012)在他的文章中所指出的,“如果函数包含某种异步执行(如Ajax调用或动画),那么回调将在异步操作开始后执行,但可能在异步操作完成之前执行。”
- 调用AJAX成功回调中的第二个函数,但这不起作用
- 最后,解决方案是在Python应用程序中添加以下代码。在执行依赖于添加到会话的值的函数之前,请检查此值是否存在:
count=1000 而不是会话['coordid']和计数: 计数-=1