0

我有一个登录路线:

@bp.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        guest = Guest(**mongo.db.guests.find_one({'username': form.username.data}))
        if guest is None or not guest.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('auth.login'))
        login_user(guest, remember=form.remember_me.data)
        print(current_user)

        flash(f'Logged in {guest.name} successfully')

        next_url = request.args.get('next')
        if not next_url or url_parse(next_url).netloc != '':
            next_url = url_for('main.index')
        return redirect(next_url)

    return render_template('login.html', form=form)

当用户“成功”登录时,它会闪烁并正确重定向用户。但是在目标页面(main.index 或 profile.view)上,用户没有登录。

索引路由/html

@bp.route('/')
def index():
    return render_template('index.html')

{% block content %}
    <h2>Home page</h2>
    <h1>Hi, {{ current_user.username }}!</h1>
    <p><a href={{ url_for('auth.register') }}>Register</a></p>
    <p><a href={{ url_for('auth.login') }}>Sign in</a></p>
    <p><a href={{ url_for('main.index') }}>Home page</a> (accessible to anyone)</p>
    <p><a href={{ url_for('profile.view') }}>Profile View</a> (login required)</p>
    <p><a href={{ url_for('profile.edit') }}>Profile Edit</a> (login required)</p>
{% endblock %}

重定向到 profile.view 时

@bp.route('/view')
@login_required
def view():
    return 'This is the profile view'

它命中 @login_required 装饰器并重定向回登录。

我正在为我的数据库使用 Flask-login (duh) 和 Flask-Pymongo。

为什么烧瓶登录当前用户在页面刷新/重定向时消失?谢谢!

4

1 回答 1

0

我的@login_manager.user_loader方法不正确。

改变:

@login_manager.user_loader
def load_user(user_id):
    from flaskr.models import Guest
    guest = mongo.db.guests.find_one({'_id': user_id})
    if guest is None:
        return None
    return Guest(**guest)

至:

@login_manager.user_loader
def load_user(user_id):
    from flaskr.models import Guest
    from flask_pymongo import ObjectId
    guest = mongo.db.guests.find_one({'_id': ObjectId(user_id)})
    if guest is None:
        return None
    return Guest(**guest)

数据库搜索总是失败,因为user_id不是Flask_Pymongo.ObjectId.

于 2019-08-23T01:10:31.867 回答