Python 在Flask中使用会话时出现KeyError

Python 在Flask中使用会话时出现KeyError,python,flask,Python,Flask,因此,我尝试使用flask将值从一个html页面传递到另一个html页面。我编写的代码如下所示: from flask import Flask, render_template from flask import request, session, url_for,abort,redirect app = Flask(__name__) app.config['SECRET_KEY'] = 'oh_so_secret' @app.route('/'): def first():

因此,我尝试使用flask将值从一个html页面传递到另一个html页面。我编写的代码如下所示:

from flask import Flask, render_template
from flask import request, session, url_for,abort,redirect

app = Flask(__name__)

app.config['SECRET_KEY'] = 'oh_so_secret'


@app.route('/'):
def first():
    session['this_one']='hello'
    render('template.html')

@app.route('/second')
def second():
   it=session['this_one']
    render('other_page.html')

if __name__ == '__main__':
    app.run(debug=True)
但是当我运行这个时,我得到一个
键错误:这是一个

因此,在重启系统后,它今天就可以工作了。然后我做了一些改变:

@app.route('/'):
def first():
    session['this_one']='goodbye'
    render('template.html')

@app.route('/second')
def second():
   it=session['this_one']
   render('other_page.html')
第二个函数仍然返回
hello

因此,
会话
字典似乎没有像我希望的那样被覆盖

跟进 这是一个真正的谜团,它在某一天起作用,而不是在第二天起作用,没有任何变化。现在在rout
('/')
中,我正在设置一个列表:

@app.route('/'):
def first():
    session['this_one']='hello'
    session['a_list']=['a','b','c']
    render('template.html')
使用print命令在第二个函数中调用它:

@app.route('/second')
def second():
    it=session['this_one']
    print(session['a_list'])
    render('other_page.html')

然后返回一个空列表。

假设代码中的所有格式错误都是打字错误,那么代码的工作方式与预期完全相同

from flask import Flask, session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'oh_so_secret'


@app.route('/')
def first():
    session['this_one'] = 'hello'
    return 'Hello was saved into session[this_one].'


@app.route('/second')
def second():
    return 'Value inside session[this_one] is {}.'.format(session['this_one'])


if __name__ == '__main__':
    app.run(debug=True)
  • 打开
    http://127.0.0.1:5000/
    ,您将获得:
    Hello已保存到会话[此会话]
  • 打开
    http://127.0.0.1:5000/second
    ,您将获得:
    会话内的值[这一个]是hello
    。这是从会话中获取的

  • 您的代码工作得很好(除了缩进问题,我假设这里是打字错误,而不是实际代码)。必须发生的是,第二个页面在第一个页面之前被访问。您可以使用异常处理来检查键错误,并在遇到错误时重定向到第一页。

    在我用头撞桌子两周后,我发现了错误,我呈现了错误的页面。。我的原始代码实际上如下所示:

    from flask import Flask, render_template
    from flask import request, session, url_for,abort,redirect
    
    app = Flask(__name__)
    
    app.config['SECRET_KEY'] = 'oh_so_secret'
    
    @app.route('/'):
        def pre-first():
        return render_template('template_old.html')
    
    @app.route('/first'):
    def first():
        greeting=request.form['greeting']
        session['this_one']=greeting
        render('template.html')
    
    @app.route('/second')
    def second():
       it=session['this_one']
       render('other_page.html')
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    通过将第一个函数更改为:

    @app.route('/'):
    def pre-first():
        return render_template('template.html')
    

    它成功了。

    我也遇到过同样的错误。使用flask登录0.4.1的flask应用程序在测试服务器中运行良好。但是,当我迁移到开发服务器时,在会话中找不到keyerror“user_id”。我很惊讶为什么会出现这个错误,因为相同的代码在我的测试服务器中运行良好。后来,经过调查,我发现我的生产服务器正在使用flask login 0.5.0,它更新了一些导致错误的默认值。因此,我将flask登录版本降级到0.4.1,并重新启动了apache服务器,该服务器在我的应用程序中运行良好。

    是否可能在第一个路由之前调用第二个路由,因此会话变量永远不会被实例化?这将如何发生?如果
    http://localhost/second
    在用户访问索引/根页面之前被访问。如果您首先访问root,代码工作正常(减去缩进不一致性错误,我认为这是打字错误),因此重新启动系统后,它工作正常,绝对不会对代码进行任何更改。这让我怀疑它与
    session
    参数有关。它需要重新实例化吗?嗯,这很奇怪。。。这是我的代码摘要请注意,让我看看我没有复制过的内容。。。