Flask Sqlalchemy:如何在每次提交模型的新实例时调用函数



我想在每次提交新用户时创建一个新的随机化用户id。为此,我使用的格式是:USR-<token>

代币由以下功能制成:

import string
import secrets
def make_token():
set = string.ascii_letters+string.digits
while True:
token = ''.join(secrets.choice(set) for i in range(6))
if(any(c.islower() for c in token) and
any(c.isupper() for c in token) and
sum(c.isdigit() for c in token)>=3 ):
break
return token

此函数将在此数据库模型中调用:

class User(db.Model):
usrid = db.Column(db.String(10), primary_key=True,
default="USR-{}".format(make_token()))
usrnm = db.Column(db.String(20), unique=True, nullable = False)

我希望代币每次都是新的。但现在,如果我提交两个User对象,它会给我一个Constraint Failed : Unique错误。此外,我正在使用SQLite进行测试,如果这有什么不同的话。模型比这个更大,但对于这个问题,我认为只有这些部分是相关的。

我认为您需要传递make_token函数作为default参数,而不是它的返回值。

所以你可以试着让你的CCD_;USR-";到字符串:

# ...
return "USR-" + token

然后将该函数作为default参数传递:

usrid = db.Column(db.String(10), primary_key=True,
default=make_token)

最新更新