我有一个Flask应用程序,它在数据库中存储了一些值。这些来自HTML表单。使用以下代码将其中一些添加到Flask会话中:
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应用程序位于另一个(未呈现的)URL上时,该URL尝试从当前会话中检索userID:
new_address.append(float(session['userid']))
我收到以下错误:
<title>KeyError: 'userid' // Werkzeug Debugger</title>
此外,我制作了一个非常简单的网页,只能打印session['userID']
。我在Flask应用程序中使用以下代码:
@app.route('/print/')
def printing():
return render_template('print.html', printing=session['userid'])
这是print.html模板:
{% extends "layout.html" %}
{% block content %}
{{ printing }}
{% endblock %}
这会产生以下错误:
builtins.KeyError
KeyError: 'userid'
我已经在一个小得多的应用程序上尝试了同样的逻辑,并且它工作正常。我的错误在哪里?
非常感谢您提供的任何帮助。
P.S。 如果它有用,我正在使用jQuery处理网页和我的Flask应用程序之间的交互,并使用AJAX发布数据。
更新
在重新设计项目以将其简化为更简单的项目之后,我发现有时(由于某种原因我不明白),向Flask会话添加新值将无效。例如,如果我包含这行代码:
session['coordid']=float(cur_var.getvalue())
在我的print.html页面中查看str(session)
的值,我看不到密钥coordid
。
答案 0 :(得分:0)
问题与AJAX的异步方式有关。如果你调用两个不同的jQuery函数,每个函数都有一个AJAX调用,很可能会有人请求尚未处理的数据。
在这种情况下,你有一个函数可以进行AJAX调用,Python会捕获它。 Python应用程序从调用中获取数据并将其存储到数据库中。与此同时,还有另一个AJx调用,Python也会处理它。但是,由于并非所有信息都已在第一次调用中完成处理,因此您将获得KeyError
。
我尝试了几件事来解决这个问题:
使用回调;然而,正如Lazaris(2012)在他的帖子Callback Functions in JavaScript中所说,“如果函数包含某种异步执行(如Ajax调用或动画),那么回调将在异步操作开始后执行,但可能在它结束之前。“
在AJAX成功回调中调用第二个函数,但这不起作用。
最后,解决方案是在Python应用程序中添加以下代码。在执行依赖于添加到会话的值的函数之前,请检查该值是否存在:
count = 1000
while not session['coordid'] and count:
count -= 1