如何在Flask-User中提交数据库之前以编程方式处理用户?

时间:2017-08-14 19:07:10

标签: flask flask-sqlalchemy flask-wtforms flask-login

简单地说,我在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

在将用户对象提交给数据库之前,我可以在哪里处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

您可以为函数指定default列的public_uuid参数。

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)

答案 1 :(得分:0)

依赖于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()

这会将assign_public_uuid()注册到Flask-User信号user_registered并依赖于正在安装的blinker包。由于user_registered在用户通过电子邮件确认其注册时未被触发,并且没有中间信号(例如user_created),我们需要保留public_uuid Nullable。

我也非常感谢有人有一种方法可以在注册时创建UUID(在确认电子邮件之前),以便UUID可以具有非Nullable约束。

有关处理Flask-User信号的更多信息:https://pythonhosted.org/Flask-User/signals.html