如何在提交到Flask user中的数据库之前以编程方式处理用户?
简单地说,我正在Flask User中创建一个如何在提交到Flask user中的数据库之前以编程方式处理用户?,flask,flask-sqlalchemy,flask-wtforms,flask-login,Flask,Flask Sqlalchemy,Flask Wtforms,Flask Login,简单地说,我正在Flask User中创建一个用户,但我希望在创建用户时以编程方式确定某些字段。也就是说,我想为用户分配一个UUID4 我从以下模板开始: 我已在我的模型中定义了所需的字段。py: class User(db.Model, UserMixin): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) ... public_uuid = db.Column(db.String(32), null
用户
,但我希望在创建用户
时以编程方式确定某些字段。也就是说,我想为用户
分配一个UUID4
我从以下模板开始:
我已在我的模型中定义了所需的字段。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)
...
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()
但是,我似乎找不到一个可以截取用户对象并设置user.public\u uuid=uuid.uuid4().hex的位置
我已经尝试过在我的表单中声明它(尽管我事先认为这是行不通的):classmyregisterform(RegisterForm):public\u uuid=uuid.uuid4().hex
因此,在写入数据库时,我最终遇到了一个错误,即public_uuid为Null
在将我的用户对象提交到DB之前,我在哪里可以处理它?一个依赖于public\u uuid
可为空的体面解决方案是将以下内容添加到您的\u init\uuuuuuuuuuuy.py
或init\u app.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)
...
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()
这将使用烧瓶用户信号User\u registed
注册assign\u public\u uuid()
,并取决于安装的blinker
软件包。由于user\u registed
在用户通过电子邮件确认其注册之前不会被触发,并且没有中间信号(如user\u created
),因此我们需要将public\u uuid
保留为空
我也非常感激有人有一种方法,可以在注册时(在电子邮件确认之前)创建UUID,这样UUID就可以有一个不可为空的约束
有关处理Flask用户信号的更多信息,请参见此处:您可以为函数指定public\u 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)
现在一切似乎都很明显。我已经使用了default
,但是直接传递它uuid.uuid4().hex
,这导致在实例化时创建单个uuid。但这样做是有道理的。谢谢