在 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__.pyinit_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)