Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
验证者_创想鸟

验证者

验证者

验证是一种确保我们的数据库仅接收适合每个属性的信息类型的方法。毕竟,我们不希望意外类型的数据进入我们的代码并导致意外的行为。幸运的是,sqlalchemy 有一个软件包可以使验证变得快速而简单!

让我们看一些简单的例子。假设我们有一个简单的模型,sandwich。这里我们已经初始化了数据库并从配置文件导入它。

from config import dbclass sandwich(db.model):    __tablename__ = 'sandwiches'    id = db.column(db.integer, primary_key=true)    name = db.column(db.string)    description = db.column(db.string)    price = db.column(db.float)

如果我们想向这些属性中的任何一个添加验证,我们需要首先导入验证包。

从 sqlalchemy.orm 导入验证

然后,在模型中使用“@validates”装饰器编写我们的函数。

    @validates('name')    def validate_name(self, key, value):        if not value:            raise valueerror('name cannot be empty.')        if type(value) != str:            raise valueerror('name must be a string.')        return value

所以这是怎么回事?让我们来分解一下。 @validates 是一个装饰器,它让我们的 orm 知道在将“name”键接收到的任何值添加到数据库之前,通过我们的验证函数传递这些值。我们返回的值是最终赋予数据库的值。 “key”参数是正在评估的键,在本例中是“name”,值是该键的值,因此我们尝试添加的实际名称(希望是文本)。因此,我们在这里检查以确保传入的 name 属性不为空,而这实际上是一个字符串。如果没有,我们会提出错误。

我们还可以通过同一个装饰器运行多个属性,方法是将它们添加到其参数中。

    @validates('name', 'description')    def validate_text(self, key, value):        if not value:            raise valueerror(f'{key} cannot be empty.')        if type(value) != str:            raise valueerror(f'{key} must be a string.')        return value

此函数验证我们的名称和描述属性,但我们通常不会对不同的属性执行相同的验证。根据验证的不同程度和数量,我们可以通过几种不同的方式来实现。我们可以为其他属性运行单独的验证器,让我们也为描述和价格验证添加长度验证:

    @validates('name')    def validate_name(self, key, value):        if not value:            raise valueerror('name cannot be empty.')        if type(value) != str:            raise valueerror('name must be a string.')        return value    @validates('description')        def validate_description(self, key, value):        if not value:            raise valueerror('description cannot be empty.')        if type(value) != str:            raise valueerror('description must be a string.')        if not 10 <= len(value) <= 200:                raise valueerror('description must be between 10 and 200 characters.')        return value    @validates('price')    def validate_price(self, key, value):        if type(value) != float:            raise valueerror('price must be a float.')        if not 1 <= value <= 15:            raise valueerror('price must be between 1 and 15')

或者,我们可以为两者保留相同的验证器,并使用传入的关键参数来调整为每个属性运行哪些验证。

    @validates('name', 'description', 'price')    def validate(self, key, value):        if key != 'price:            if not value:                raise valueerror(f'{key} cannot be empty.')            if type(value) != str:                raise valueerror(f'{key} must be string.')            if key == 'description':                if not 10 <= len(value) <= 200:                    raise valueerror('description must be between 10 and 200 characters.')        else:            if type(value) != float:                raise valueerror(f'{key} must be a float.')            if not 1 <= value <= 15:                raise valueerror('price must be between 1 and 15')        return value

嗯,这有点乱,让我们重构为 2 个单独的验证器。

    @validates('name', 'description')    def validate_text(self, key, value):       if not value:            raise valueerror(f'{key} cannot be empty.')        if type(value) != str:            raise valueerror(f'{key} must be string.')        if key == 'description':            if not 10 <= len(value) <= 200:                raise valueerror('description must be between 10 and 200 characters.')    @validates('price')    def validate_price(self, key, value):        if type(value) != float:            raise valueerror('price must be a float.')        if not 1 <= value <= 15:            raise valueerror('price must be between 1 and 15')

那就更好了!这是我们完成的模型:

from sqlalchemy.orm import validatesfrom config import dbclass Sandwich(db.Model):    __tablename__ = 'sandwiches'    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String)    description = db.Column(db.String)    price = db.Column(db.Float)    @validates('name', 'description')    def validate_text(self, key, value):        if not value:            raise ValueError(f'{key} cannot be empty.')        if type(value) != str:            raise ValueError(f'{key} must be string.')        if key == 'description':            if not 10 <= len(value) <= 200:                raise ValueError('Description must be between 10 and 200 characters.')    @validates('price')    def validate_price(self, key, value):        if type(value) != float:            raise ValueError('Price must be a float.')        if not 1 <= value <= 15:            raise ValueError('Price must be between 1 and 15')

就是这样!验证是一种简单的工具,可确保您的数据库保持正确和正确。

以上就是验证者的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1353382.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
为什么快速关闭 TCP 连接会导致端口处于 TIME_WAIT 状态,如何解决端口占用问题?
上一篇 2025年12月13日 17:38:32
for循环中return语句的位置为何影响素数判断结果?
下一篇 2025年12月13日 17:38:46

相关推荐

发表回复

登录后才能评论
关注微信