【问题标题】:load_user function gets None as a parameterload_user 函数获取 None 作为参数
【发布时间】:2020-07-28 01:19:42
【问题描述】:

我正在构建一个非常简单的 Flask 应用程序,当我从 flask-login 实现 load_user 时,我开始遇到错误,因为该函数将 None 传递给它并尝试使用 None 值进行查询。

from flask_login import LoginManager

login_manager = LoginManager()
login_manager.login_view = 'auth.login'

@login_manager.user_loader
def load_user(id):
    return User.query.get(id)

可能相关的文件:

auth/__init__.py:

from flask import Blueprint

auth = Blueprint('auth', __name__, url_prefix='/auth')

from . import views

auth/views.py:

from flask import render_template, redirect, url_for, flash, session
from flask_login import login_user
from app.forms import LoginForm
from app.models import User
from app.queries import get_user
from . import auth

@auth.route('/login', methods=['GET', 'POST'])
def login():
    login_form = LoginForm()
    context = {
        'login_form' : login_form
    }
    username = login_form.username.data
    password = login_form.password.data
    if login_form.validate_on_submit():
        user_query = get_user(username)
        if user_query:
            db_password = user_query.password

            if password == db_password:
                registeredUser = User(username = username,
                                      password = password)
                login_user(registeredUser)
                flash('Bienvenido de nuevo!', 'alert alert-success alert-dismissible')

                return redirect(url_for('hello'))

            else:
                flash('La información no coincide', 'alert alert-danger')
        else:
            flash('El usuario no existe.', 'alert alert-danger')


        return redirect(url_for('index'))
    
    return render_template('login.html', **context)

我没有使用用户名作为主键,我有一个单独的 id 列。

【问题讨论】:

    标签: python flask flask-login


    【解决方案1】:

    假设,从上下文来看,user_query = get_user(username) 实际上是一个用户对象而不是一个查询,创建一个新用户并将其传递给login_user,然后再持久化它意味着它的id 将是None

    简单的解决方法是替换

    if password == db_password:
        registeredUser = User(username = username,
                              password = password)
        login_user(registeredUser)
    

    if password == user_query.password:
        login_user(user_query)
    

    然后再考虑将user_query重命名为user,这样代码更清晰。

    另外,考虑一下不要明文存储用户密码。 Flask Mega Tutorial 有一章将引导您了解如何存储加密的密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 2016-05-25
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多