4

当用户登录到我的示例应用程序时,我将用户名键添加到会话对象中,并将用户对象挂在全局“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'))

现在,如果用户成功登录(正在发生的事情),他将重定向到主页。这将拆除旧的请求并产生一个新的请求。问题是当一个新请求开始时会话被擦除。我正在打印会话密钥,它们都是空的。这只发生在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'])
4

2 回答 2

6

好吧,由于有多名工作人员,这确实是答案,我将把它从评论部分移开。:) 您不希望 redis 在 gunicorn 层,而是在您的应用程序中。这四个链接应该可以帮助您:

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

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

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

4)python基础redis教程

这三个链接应该可以帮助您入门,如果还不够,我会挖掘更多示例,因此请询问您是否需要它们!

于 2012-11-30T23:46:03.910 回答
0

尝试在你的 app.py 中包含这个

from flask import session
from flask_session import Session 
app.secret_key = 'A0AKR5TGD\ R~XHH!jmN]LWX/,?RT'
app.config["SESSION_PERMANENT"] = True
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

不提供有关目录的任何信息

于 2021-12-01T02:15:31.100 回答