【问题标题】:flask g.user and before_request烧瓶 g.user 和 before_request
【发布时间】:2013-11-01 03:23:05
【问题描述】:

我有一个使用烧瓶登录的简单设置,如下所示。当我点击 before_request 时,g.user 设置正确。我也在正确注册用户(因为他们使用正确的电子邮件/通行证访问数据库)。我的问题是在 before_request 和页面命中之间,g.user 总是变为无。我想我在会话中遗漏了一些东西,但我不知道是什么。

初始化

lm = LoginManager()
lm.init_app(app)
lm.login_view = 'login'

在 view/login.py 文件中,我有以下内容。

views/login.py:

@app.lm.user_loader
def load_user(id):
    return models.user.user_with_id(id)

@app.before_request
def before_request():
    g.user = current_user
    print 'current_user: %s, g.user: %s, leaving bef_req' % (current_user, g.user)

@app.route('/login', methods=['GET', 'POST'])
def login():
    print 'in login, g.user: %s' % g.user
    if g.user is not None and g.user.is_authenticated():
        return redirect(url_for('index'))
    enter_form = app.forms.EnterForm()
    if enter_form.validate_on_submit():
        session['remember_me'] = True
        return app.models.user.try_register(enter_form.email.data,
                                            enter_form.password.data)
    return render_template('index.html', enter_form=enter_form, profiles=[])

views/index.py:

@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
    print 'in index, g.user: %s' % g.user
    if not g.user:
        return redirect(url_for('login'))
    return render_template('index.html')

模型/user.py:

def try_login(email, password, remember_me):
    u = user_with_email(email)
    if u and authenticate(u, password):
        login_user(u, remember=remember_me)
    return app.views.index.go_to_index()

def try_register(email, password, role=ROLE_USER):
    if not user_with_email(email):
        add_user(password, role=role, email=email)
    return try_login(email, password)

【问题讨论】:

  • 您的 before_request 函数没有 @app.before_request 装饰器。会不会是这个问题?
  • 啊,感谢您指出这一点,但那已经存在了。我只是忘了把它放到窗口里。 (顺便说一句,超级感谢你的教程。我在之前的 Flask 中大量使用了它)

标签: python session flask


【解决方案1】:

您的try_login 函数将remember_me 作为第三个参数,但在sn-p 中,前提是您在try_register 中调用try_login 时未设置它。也许这是你的问题。请注意,remember_me 应该是布尔值。

您还应该将remember_me 放入try_register 调用中。

最后,在登录函数中调用 regsiter 函数并在寄存器中调用 try_login 是很奇怪的。图案有点乱:)

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2013-11-03
    • 2011-12-15
    • 1970-01-01
    • 2018-04-15
    • 2021-11-16
    • 2018-05-24
    • 2012-11-28
    相关资源
    最近更新 更多