You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复基于Flask-Login与MongoEngine的Flask登录系统

修复Flask-Login + MongoEngine登录系统的问题

以下是你的代码中存在的关键问题及对应修复方案,逐一调整后即可解决登录失败的问题:

1. 移除循环导入语句

app.py中导入的from app import *会引发循环导入错误,直接删除该行:

# 删掉这行代码
from app import *

2. 修复用户加载器与模型的匹配问题

load_user函数的查询条件错误,且需确保Flask-Login能正确识别用户唯一标识:

  • 修改load_user函数,匹配模型的UserID字段:
@login_manager.user_loader 
def load_user(userID):
    # 字段名是UserID,不是user
    return Test2.objects(UserID=userID).first()
  • 给Test2模型补充主键设置与get_id方法,适配Flask-Login的用户识别逻辑:
class Test2(UserMixin, db.Document):
    UserID = db.StringField(primary_key=True)  # 设为主键,保证唯一性
    FirstName = db.StringField()
    LastName = db.StringField()
    Birthday = db.StringField()
    Email = db.StringField()
    Password = db.StringField()
    AccountType = db.StringField()
    Address = db.StringField()
    Phone = db.StringField()

    def get_id(self):
        return str(self.UserID)  # 返回字符串类型的用户ID,适配Flask-Login要求

    def check_password(self, password):
        return check_password_hash(self.Password, password)

3. 确保密码为哈希存储

check_password_hash仅能验证通过generate_password_hash生成的哈希值,如果数据库中存储的是明文密码,登录必然失败。注册用户时需先哈希密码:

# 示例注册逻辑(需补充到你的代码中)
hashed_password = generate_password_hash("用户输入的明文密码")
new_user = Test2(
    UserID="唯一用户ID",
    Email="test@example.com",
    Password=hashed_password,
    # 其他字段赋值
)
new_user.save()

4. 修正表单初始化方式

Flask-WTF会自动处理请求数据,无需手动传入request.form:

@app.route("/", methods = ["get", "post"])
def homepage():
    form = LoginForm()  # 去掉request.form参数
    if form.validate_on_submit():
        user = Test2.objects(Email=form.username.data).first()
        if user and user.check_password(form.password.data):
            login_user(user)
            next_url = request.args.get('next')
            return redirect(next_url or url_for('loggedin'))  # 去掉.,直接使用视图函数名
    return render_template('homepage.html', form=form)  # 明确传递form变量,避免**locals()的潜在问题

5. 在模板中添加错误提示

当前模板未显示验证或登录失败的原因,添加错误提示便于排查:
修改homepage.html:

<form method="Post" action="{{ url_for('homepage') }}">
    {{ form.csrf_token }}
    <div>
        {{ form.username.label }}
        {{ form.username }}
        {% if form.username.errors %}
            {% for error in form.username.errors %}
                <p style="color:red;">{{ error }}</p>
            {% endfor %}
        {% endif %}
    </div>
    <div>
        {{ form.password.label }}
        {{ form.password }}
        {% if form.password.errors %}
            {% for error in form.password.errors %}
                <p style="color:red;">{{ error }}</p>
            {% endfor %}
        {% endif %}
    </div>
    <!-- 添加全局登录错误提示 -->
    {% if get_flashed_messages() %}
        {% for msg in get_flashed_messages() %}
            <p style="color:red;">{{ msg }}</p>
        {% endfor %}
    {% endif %}
    <input type="submit" value="submit">
</form>

同时在视图中添加Flash提示,告知用户登录失败原因:

@app.route("/", methods = ["get", "post"])
def homepage():
    form = LoginForm()
    if form.validate_on_submit():
        user = Test2.objects(Email=form.username.data).first()
        if not user:
            flash("该邮箱未注册")
        elif not user.check_password(form.password.data):
            flash("密码错误")
        else:
            login_user(user)
            next_url = request.args.get('next')
            return redirect(next_url or url_for('loggedin'))
    return render_template('homepage.html', form=form)

6. 修正LoginManager的登录视图配置

将.homepage改为'homepage',避免命名空间问题:

login_manager.login_view = 'homepage'

完成以上修改后重启服务,测试登录即可正常跳转至loggedin.html页面。


内容的提问来源于Stack Exchange,提问作者xxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:55:28