user_datastore.create_user() 未将用户添加到 MySQL 数据库

user_datastore.create_user() not adding user to MySQL db

我正在尝试使用 Python Flask 创建一个身份验证系统。但是,每当我提交注册表时,都没有错误并且重定向正确,但用户信息从未存储在我的 MySQL 数据库中。

这是我用来设置 user_datastore 的代码:

(app initiation and other config)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:dumbypassword@localhost/myDB

db = SQLAlchemy(app)

roles_users = db.Table('roles_users',
                       db.Column('email', db.String(50), db.ForeignKey('users.email')),
                       db.Column('role', db.String(20), db.ForeignKey('roles.role'))
              )


class User(db.Model):
    __tablename__ = 'users'
    firstName = db.Column(db.String(20), nullable=False)
    lastName = db.Column(db.String(30), nullable=False)
    email = db.Column(db.String(50), primary_key=True, unique=True, nullable=False)
    password = db.Column(db.LargeBinary())  # should be hashed with salt
    salt = db.Column(db.String(22))
    active = db.Column(db.Boolean())
    confirmed = db.Column(db.DateTime())
    roles = db.relationship(
        'Role',
        secondary=roles_users,
        backref=db.backref('users')
    )


class Role(db.Model):
    __tablename__ = 'roles'
    role = db.Column(db.String(20), primary_key=True, nullable=False)
    description = db.Column(db.String(255))


user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

下面是我的注册页面中用于创建新用户的逻辑:

salt = bcrypt.gensalt()
user_datastore.create_user(
    firstName=request.form.get('firstName'),
    lastName=request.form.get('lastName'),
    email=request.form.get('email'),
    password=bcrypt.hashpw(request.form.get('password').encode('utf-8'), salt),  # TODO: Need to bcrypt pass + salt
    salt=salt,
    active=1,
    confirmed=datetime.now()
)

使用方法“POST”提交注册表后,将存储 none 的信息:( 查看我的查询和结果:

我暗暗怀疑我在破坏所有这些,所以任何帮助,包括但不限于 naming/formatting 约定,将不胜感激。

回答您的确切问题 - 看起来您没有将事务提交给数据库。 Flask-Security 将此作为 @after_this_request 的一部分进行,因此如果在请求期间发生任何错误,数据将被回滚。所以 - 在处理后的某个地方你需要调用 datastore.commit()

一个元问题是 - 看起来您正在重新发明一堆东西。 Flask-Security-Too 已经在管理注册,您可以轻松地扩展它——此外,最好的做法是让面向安全的包完成它们的工作——所以对于密码和加盐——Flask-Security 和 passlib 已经有很多管理这些的历史——因此,除非您有一些特定要求(我想听听这些要求),否则请留给他们。绝对不要将盐与用户记录一起存储在数据库中。 Flask-Security-Too 有一个 public api 'hash_password' 你可以使用(它使用 passlib 的 CryptoContext 来传递适当的选项)。