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

问题描述

我正在尝试使用 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),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”方法提交注册表后,没有存储任何信息:( 查看我的查询和结果:

enter image description here

我偷偷怀疑我正在屠杀所有这些,因此我们将不胜感激,包括但不限于命名/格式约定。

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...