gpt4 book ai didi

python - Flask Python 模型验证

转载 作者:太空狗 更新时间:2023-10-29 17:55:09 27 4
gpt4 key购买 nike

来自 php 背景,我正在通过 Flask 学习 python。我为客户端使用了 WTForms,它可以很好地处理验证。

但是,我想使用 Flask 的其中一件事是公共(public) API,在这种情况下,我希望所有验证都在我的模型上运行。我以为 SQLAlchemy 会包含验证功能,但事实并非如此。

我遇到过Colander ,看起来不错,但我有点惊讶没有更普遍的验证库。更令人惊讶的是,SQLAlchemy 本身并没有这样做。

这里有哪些选项?也许我遗漏了什么,但我怎样才能轻松验证模型数据?

最佳答案

您是否考虑过在模型层进行验证...

这将使您拥有一个完美的 DRY 解决方案,因为无论更新源是用户发送的数据,还是更新模型作为间接更新的一部分的应用程序组件,都会自动触发验证.简而言之,您还可以在前端使用 WTForms 重用此解决方案,并且只有一个地方可以对 API 和前端进行验证。

参见 this answer了解更多在模型中进行验证的专业人士。


...使用 SQLAlchemy 提供的工具?

1。 The validates() decorator用于简单验证:

使用这个装饰器非常简单:只需将它应用到您要验证的字段即可:

from sqlalchemy.orm import validates

class EmailAddress(Base):
__tablename__ = 'address'

id = Column(Integer, primary_key=True)
email = Column(String)

@validates('email')
def validate_email(self, key, address):
assert '@' in address
return address

2。 ORM Events对于复杂的业务规则:

当模型实例的属性之一发生变化时,您可以使用属性事件直接执行复杂的验证。使用属性事件的优点是可以保证 session 中的数据(内存中的对象)处于经过验证的状态。

这是来自 docs 的示例(一个简单的,但您应该在这里考虑复杂的规则) :

def validate_phone(target, value, oldvalue, initiator):
"Strip non-numeric characters from a phone number"

return re.sub(r'(?![0-9])', '', value)

# setup listener on UserContact.phone attribute, instructing
# it to use the return value
listen(UserContact.phone, 'set', validate_phone, retval=True)

您还可以使用映射器事件,例如 before_insert将验证推迟到 session.add() 调用,甚至使用 Session Events拦截提交...但是您失去了 session 中数据的完整性保证...

关于python - Flask Python 模型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11582233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com