在 Flask-User 中提交数据库之前如何以编程方式处理用户?
How to programmatically handle a user before committing to database in Flask-User?
简单地说,我正在 Flask-User 中创建一个 User
,但我想在创建 User
时以编程方式确定某些字段。也就是说,我想为 User
分配一个 UUID4。
我从以下模板开始:Flask-User-starter-app
我已经在 models.py
:
中定义了我需要的字段
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
...
public_uuid = db.Column(db.String(32), nullable=False, unique=True)
...
不过我好像找不到可以截取用户对象并设置的地方user.public_uuid = uuid.uuid4().hex
我试过在我的表单中声明它(尽管我事先认为那行不通):class MyRegisterForm(RegisterForm): public_uuid = uuid.uuid4().hex
所以我在写入数据库时得到了 public_uuid 是 Null
的错误。
在提交到数据库之前,我可以在哪里处理我的用户对象?
依赖于 public_uuid
可以为空的一个不错的解决方案是将以下内容添加到您的 __init__.py
或 init_app.py
:
from flask import Flask
app = Flask(__name__) # The WSGI compliant web application object
...
@user_registered.connect_via(app)
def assign_public_uuid(sender, user, **extra):
user.public_uuid = str(uuid.uuid4().hex)
db.session.commit()
这会向 Flask-User 信号 user_registered
注册 assign_public_uuid()
,并且取决于正在安装的 blinker
包。由于 user_registered
在用户通过电子邮件确认其注册之前不会被触发,并且没有中间信号(如 user_created
),因此我们需要将 public_uuid
保留为空。
我也非常感激有人有一种方法可以在注册时(在电子邮件确认之前)创建 UUID,以便 UUID 可以具有不可为空的约束。
有关处理 Flask 用户信号的更多信息,请点击此处:https://pythonhosted.org/Flask-User/signals.html
您可以将 public_uuid
列的 default
参数指定给函数。
def generate_uuid():
return uuid.uuid4().hex
class User(db.Model, UserMixin):
# ...
public_uuid = db.Column(db.String(32), nullable=False, unique=True, default=generate_uuid)
简单地说,我正在 Flask-User 中创建一个 User
,但我想在创建 User
时以编程方式确定某些字段。也就是说,我想为 User
分配一个 UUID4。
我从以下模板开始:Flask-User-starter-app
我已经在 models.py
:
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
...
public_uuid = db.Column(db.String(32), nullable=False, unique=True)
...
不过我好像找不到可以截取用户对象并设置的地方user.public_uuid = uuid.uuid4().hex
我试过在我的表单中声明它(尽管我事先认为那行不通):class MyRegisterForm(RegisterForm): public_uuid = uuid.uuid4().hex
所以我在写入数据库时得到了 public_uuid 是 Null
的错误。
在提交到数据库之前,我可以在哪里处理我的用户对象?
依赖于 public_uuid
可以为空的一个不错的解决方案是将以下内容添加到您的 __init__.py
或 init_app.py
:
from flask import Flask
app = Flask(__name__) # The WSGI compliant web application object
...
@user_registered.connect_via(app)
def assign_public_uuid(sender, user, **extra):
user.public_uuid = str(uuid.uuid4().hex)
db.session.commit()
这会向 Flask-User 信号 user_registered
注册 assign_public_uuid()
,并且取决于正在安装的 blinker
包。由于 user_registered
在用户通过电子邮件确认其注册之前不会被触发,并且没有中间信号(如 user_created
),因此我们需要将 public_uuid
保留为空。
我也非常感激有人有一种方法可以在注册时(在电子邮件确认之前)创建 UUID,以便 UUID 可以具有不可为空的约束。
有关处理 Flask 用户信号的更多信息,请点击此处:https://pythonhosted.org/Flask-User/signals.html
您可以将 public_uuid
列的 default
参数指定给函数。
def generate_uuid():
return uuid.uuid4().hex
class User(db.Model, UserMixin):
# ...
public_uuid = db.Column(db.String(32), nullable=False, unique=True, default=generate_uuid)