从Flask会话

时间:2017-05-28 00:43:29

标签: 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': 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

1 个答案:

答案 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