简单地说,我在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>
答案 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__.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()
这会将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