Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在提交到Flask user中的数据库之前以编程方式处理用户?_Flask_Flask Sqlalchemy_Flask Wtforms_Flask Login - Fatal编程技术网

如何在提交到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

简单地说,我正在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), 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。但这样做是有道理的。谢谢