Flask会话不会持久存在于heroku上

The*_*net 3 python heroku flask

当用户登录我的示例应用程序时,我将一个用户名密钥添加到会话对象中,并将用户对象挂起全局"g"对象.见下文.

@app.route('/login/', methods=['GET', 'POST'])
def login():
    """Logs the user in."""

    error = None
    if request.method == 'POST':
        print("login hit")
        user = get_user(request.form['username'])
        if user is None:
            error = 'Invalid username'
            print error
        elif not check_password_hash(user.password, request.form['password']):
            error = 'Invalid password'
            print error
        else:
            flash('You were logged in')
            print "logged in"
            session['username'] = request.form['username']
            g.user = request.form['username']
            print error, "error"
            return redirect(url_for('main'))
Run Code Online (Sandbox Code Playgroud)

现在,如果用户成功登录(正在发生的事情),他将重定向到主页面.这将拆除旧请求并生成一个新请求.问题是当新请求开始时,会话被擦除.我打印出会话密钥,它们都是空的.这只发生在heroku上,而不是在我的本地机器上.我究竟做错了什么.

  @app.before_request
    def before_request():
        print session.keys(), session.values()  # shows [] []
        print("before request")
        print ('username' in session, "in session?")
        g.db = connect_db()
        g.user = None
        if "username" in session:
            g.user = get_user(session['username'])
Run Code Online (Sandbox Code Playgroud)

moo*_*odh 5

嗯,看到这确实是由于多个工人的答案,我将从评论部分移动它.:)你不希望redis在gunicorn层,而不是你的应用程序.这四个链接可以帮助你:

1)首先,在Heroku中启用/安装Redis

2)然后检查一下(将基于redis替换Flasks整个会话驱动程序):这可能是矫枉过正,我只是在应用程序中使用redis作为密钥存储值(检查我的第三个链接)但你可能会喜欢这种方法.

3)没有相关但显示了一些使用示例(带有redis的烧瓶排队系统)

4)python的基本redis教程

这三个链接应该让你开始,如果它还不够我会挖掘更多的例子,所以只要问你是否需要它们!