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 来传递适当的选项)。
我正在尝试使用 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 来传递适当的选项)。