python - 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
参数传递,而不是其返回值。
所以你可以尝试让你的make_token
函数在字符串前面加上“USR-”:
# ...
return "USR-" + token
default
然后将该函数作为参数传递:
usrid = db.Column(db.String(10), primary_key=True,
default=make_token)
推荐阅读
- python - 在 matplotlib 和 pandas 中组合和重新定位两个图表的图例的困难
- javascript - 如何使用chartjs仅显示偶数值的网格线?
- python - Python matplolib图例如何减少框架左边缘和标记之间的距离
- node.js - 删除 Windows 10 上的所有文件夹
- javascript - 当虚拟键盘打开时优雅地防止固定元素移动
- sqlite - Symfony:刷新测试数据库以进行 phpunit 测试,并在添加的夹具上重置自动增量
- php - 激活另一个主题时 WordPress 超时
- c - 对输入文本文件的内容进行排序并用c语言创建一个make qemu
- python - 关于 IntEnum 的一个奇怪的“ImportError”
- go - 上传文件时杜松子酒不断返回204