当前位置: 首页 > news >正文

如何给网站做404页面网站优化招商

如何给网站做404页面,网站优化招商,深圳app网站,国家企业信息系统查询系统官方版本 sqlalchemy1.4.37 需求说明 有个场景,需要在orm中对两个字段进行联合校验,当 col1 xxx’时,对 col2的长度进行检查,超过限制(500)时,进行截断。 网上找了很久,没找到类似的…

版本

sqlalchemy==1.4.37

需求说明

有个场景,需要在orm中对两个字段进行联合校验,当 col1 ='xxx’时,对 col2的长度进行检查,超过限制(500)时,进行截断。

网上找了很久,没找到类似的实现,自己摸索出来了一套方法;

解决

在 validates 装饰器中,它是在设置字段值之前被调用的,validates 包装的函数校验完成后通过return赋值给字段

validates 的执行顺序 看起来是和 字段 传入ORM模型的顺序 一样。
如 下面案例 中的 model_instance 中,如果 col1 在 col2 之前,就会先校验和赋值 col1 ,反之,则先校验和赋值 col12

方案1

保证 model_instance 中 字段 col1 在 col2 之前,这样会先校验和赋值 col1 ,在校验 col2 时,self.col1 就不会为空,能正常进行校验。

如果先赋值col2,在 validate_col2 中,会self.col1会为None,导致校验失败

from sqlalchemy.orm import validates
from sqlalchemy import Column, String, Integer
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class MyModel(Base):__tablename__ = 'my_model'id = Column(Integer, primary_key=True)col1 = Column(String(50))col2 = Column(String(500))  # 假设col2的最大长度是500个字符@validates('col2')def validate_col2(self, key, value):# 检查col1的值是否为'xxx'if self.col1 == 'xxx':# 如果col1是'xxx',则校验col2的长度if len(value) > 500:value = value[:500]# 如果col1不是'xxx',可以选择不做任何操作或者添加其他逻辑return value # 示例使用1
# 先赋值 col1 再赋值 col2
model_instance = MyModel()
model_instance.col1 = 'xxx'  # 假设这是触发条件的值
model_instance.col2 = 'a' * 501  # 这将触发长度校验# 示例使用2
datas = {'col1'= 'xxx', 'col2': 'a' * 501 }
# 先pop删除,再添加,就不管前面datas是怎么来的,可以保证 datas 中 col2会比col1后遍历到
_col2_v = datas.pop('col2')
datas['col2'] = _col2_v  
model_instance = MyModel(**datas )try:# 假设这是保存模型到数据库的代码# session.add(model_instance)# session.commit()pass
except ValueError as e:print(e)

方案2

实例化orm模型后,再调用一遍 validate_col2 ,校验并赋值给col2

from sqlalchemy.orm import validates
from sqlalchemy import Column, String, Integer
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class MyModel(Base):__tablename__ = 'my_model'id = Column(Integer, primary_key=True)col1 = Column(String(50))col2 = Column(String(500))  # 假设col2的最大长度是500个字符@validates('col2')def validate_col2(self, key, value):# 检查col1的值是否为'xxx'if self.col1 == 'xxx':# 如果col1是'xxx',则校验col2的长度if len(value) > 500:value = value[:500]# 如果col1不是'xxx',可以选择不做任何操作或者添加其他逻辑return value # 示例使用1
# 先赋值 col1 再赋值 col2
model_instance = MyModel()
model_instance.col1 = 'xxx'  # 假设这是触发条件的值
model_instance.col2 = 'a' * 501  # 这将触发长度校验# 示例使用2
datas = {'col1'= 'xxx', 'col2': 'a' * 501 }model_instance = MyModel(**datas )
# 上面实例化会自动调用所有的 `validates` 函数,下面再调用一遍`validate_col2`, 
# 并且要用 `model_instance.col2` 接收返回值,不然 `model_instance.col2` 的值不会改变。
model_instance.col2 = model_instance.validate_col2('col2', datas['col2'])try:# 假设这是保存模型到数据库的代码# session.add(model_instance)# session.commit()pass
except ValueError as e:print(e)

方案3

无法保证 model_instance 中 字段 col1 在 col2 之前的顺序,采用 临时变量 __col1,存储 col1 的值,并对 col2 进行二次校验赋值

validate_col1 函数中,校验 col1,先把 value 值(就是没校验前的col1的值)赋给 self.__col1,然后再调用 validate_col1_and_col2 进行联合校验,最后通过 return把value赋值给 self.col1

在整个过程中,validate_col1_and_col2 会被调用3次

  • 校验 col2 时,validate_col2 会调用一次
  • 校验 col1 时,self.col2 = self.validate_col1_and_col2(key='col2', value=self.col2) 这一行会调用两次:
    1. 一次是 self.validate_col1_and_col2 执行;
    2. 另一次是 1 执行完后对 self.col2 赋值,会调用一次 validate_col2 ,进而再调用一次
from sqlalchemy.orm import validates
from sqlalchemy import Column, String, Integer
from sqlalchemy.ext.declarative import declarative_basedef getStrLenAndTruncate(ss: str, max_length=500):"""获取字符串长度,超过部分截断:param ss::param max_length::return:"""slen = len(ss.encode('utf-8'))# 如果编码后的字符串长度小于或等于500字节,则不需要截断if slen <= max_length:return ss# 截断到500字节的长度,注意这里直接截断可能会导致字符不完整# 因此需要找到一个合适的截断点,确保截断后的字符串是完整的utf-8字符truncated_encoded = b''current_length = 0for char in ss:char_encoded = char.encode('utf-8')if current_length + len(char_encoded) <= max_length:truncated_encoded += char_encodedcurrent_length += len(char_encoded)else:breaktruncated_str = truncated_encoded.decode('utf-8', errors='ignore')print(f'原字符串编码后长度为{slen}, 超过限制{max_length}, 需进行截断\n原字符串={ss}, \n截断后字符串:{truncated_str}')return truncated_strBase = declarative_base()class MyModel(Base):__tablename__ = 'my_model'__col1 = ''id = Column(Integer, primary_key=True)col1 = Column(String(50))col2 = Column(String(500))  # 假设col2的最大长度是500个字符@validates('col1')def validate_col1(self, key, value):self.__col1 = valueself.col2 = self.validate_col1_and_col2(key='col2', value=self.col2)return value@validates('col2')def validate_col2(self, key, value):value = validate_col1_and_col2(key, value)return value def validate_col1_and_col2(self, key, value):# 检查col1的值是否为'xxx'if self.__col1== 'xxx':if not value:value = ''elif len(value) * 3 <= 500:# 存储到 oracle,中文占3个字符passelse:print('需检查 col2 长度')value = getStrLenAndTruncate(value)return value# 示例使用
datas = {'col1'= 'xxx', 'col2': 'a' * 501 }
model_instance = MyModel(**datas )try:# 假设这是保存模型到数据库的代码# session.add(model_instance)# session.commit()pass
except ValueError as e:print(e)

说明

为啥不省略下面这个 validate_col2 这个校验代码:

    @validates('col2')def validate_col2(self, key, value):value = validate_col1_and_col2(key, value)return value 

因为 这个方案中,col1 、col2进入 orm模型的顺序不一定,如果省略了validate_col2 ,当col1比col2先进入模型,那么在 validate_col1 调用 self.validate_col1_and_col2(key='col2', value=self.col2) 时,self.col2其实等于None,此时对col2校验是没有意义的。等到 col2 进入 orm模型,又缺少对它进行校验的函数。

注意:

不能在 某个字段的校验函数中对其进行赋值操作,不然会陷入递归循环,因为赋值操作会调用校验函数;

如下面的调用会陷入递归死循环,因为 self.col1 = value 这行代码对 self.col1 进行了赋值,会自动再次调用validate_col1校验函数,就会在这一行陷入递归死循环而报错。


class MyModel(Base):@validates('col1')def validate_col1(self, key, value):self.__col1 = valueself.col1 = valueself.col2 = self.validate_col1_and_col2(key='col2', value=self.col2)return value

其他方案

不走orm模型,直接写校验代码和原生sql处理。

最后

这就是我尝试出来的 在 sqlalchemy.orm中validates对两个字段进行联合校验的方法,总感觉不太完美,不知道有没有大佬知道更好的方案,欢迎分享


文章转载自:
http://dinncoradon.bkqw.cn
http://dinncomoksa.bkqw.cn
http://dinncoarsenotherapy.bkqw.cn
http://dinncodactinomycin.bkqw.cn
http://dinncogilding.bkqw.cn
http://dinncointroductory.bkqw.cn
http://dinncohypoglobulia.bkqw.cn
http://dinncoseabee.bkqw.cn
http://dinncocoreper.bkqw.cn
http://dinncolorn.bkqw.cn
http://dinncooxalic.bkqw.cn
http://dinncolaboring.bkqw.cn
http://dinncolevigation.bkqw.cn
http://dinncosignore.bkqw.cn
http://dinncounbearded.bkqw.cn
http://dinncotranscribe.bkqw.cn
http://dinncobetoken.bkqw.cn
http://dinncopolyfoil.bkqw.cn
http://dinncocreamily.bkqw.cn
http://dinncodisregard.bkqw.cn
http://dinncorelique.bkqw.cn
http://dinncoteen.bkqw.cn
http://dinncobriefly.bkqw.cn
http://dinncosistine.bkqw.cn
http://dinncomalefactor.bkqw.cn
http://dinncoliquefacient.bkqw.cn
http://dinncoempiric.bkqw.cn
http://dinncofractionalism.bkqw.cn
http://dinncounilocular.bkqw.cn
http://dinncorenomination.bkqw.cn
http://dinnconondirective.bkqw.cn
http://dinncoreductivism.bkqw.cn
http://dinncosyndicate.bkqw.cn
http://dinncocineraria.bkqw.cn
http://dinncospectinomycin.bkqw.cn
http://dinncoderogation.bkqw.cn
http://dinncoservite.bkqw.cn
http://dinncowain.bkqw.cn
http://dinncocloudward.bkqw.cn
http://dinncoallium.bkqw.cn
http://dinncomortgager.bkqw.cn
http://dinncostrake.bkqw.cn
http://dinncodissertation.bkqw.cn
http://dinncocitriculturist.bkqw.cn
http://dinncokalendar.bkqw.cn
http://dinncotechnolatry.bkqw.cn
http://dinncoexacting.bkqw.cn
http://dinncocompeer.bkqw.cn
http://dinncoawoken.bkqw.cn
http://dinnconiff.bkqw.cn
http://dinncotetraxile.bkqw.cn
http://dinncoeducate.bkqw.cn
http://dinncospermogonium.bkqw.cn
http://dinncospongeware.bkqw.cn
http://dinncosuperstitiously.bkqw.cn
http://dinncoleukocytoblast.bkqw.cn
http://dinncohemorrhage.bkqw.cn
http://dinncobirdlime.bkqw.cn
http://dinncoyahwism.bkqw.cn
http://dinncofortunately.bkqw.cn
http://dinncosubluxation.bkqw.cn
http://dinncocaip.bkqw.cn
http://dinncobiannually.bkqw.cn
http://dinncostandoffish.bkqw.cn
http://dinncomitre.bkqw.cn
http://dinncoritardando.bkqw.cn
http://dinncoileac.bkqw.cn
http://dinncomucic.bkqw.cn
http://dinncohyposensitize.bkqw.cn
http://dinncoaluminiferous.bkqw.cn
http://dinncoimpetiginous.bkqw.cn
http://dinncohelianthus.bkqw.cn
http://dinncolaminarization.bkqw.cn
http://dinncogoosy.bkqw.cn
http://dinncokiddywink.bkqw.cn
http://dinncotrigger.bkqw.cn
http://dinncounity.bkqw.cn
http://dinncodiomedes.bkqw.cn
http://dinncobeautician.bkqw.cn
http://dinncojamboree.bkqw.cn
http://dinncomadrileno.bkqw.cn
http://dinncowelchman.bkqw.cn
http://dinncoroentgenometer.bkqw.cn
http://dinncojudaise.bkqw.cn
http://dinncoprosecutor.bkqw.cn
http://dinncojams.bkqw.cn
http://dinncostoppage.bkqw.cn
http://dinncochummery.bkqw.cn
http://dinncolavish.bkqw.cn
http://dinncofinlandization.bkqw.cn
http://dinncobeebee.bkqw.cn
http://dinncoreassemble.bkqw.cn
http://dinncochoora.bkqw.cn
http://dinncounverifiable.bkqw.cn
http://dinncopolyrhythm.bkqw.cn
http://dinncoembalm.bkqw.cn
http://dinncoskiddy.bkqw.cn
http://dinncogallate.bkqw.cn
http://dinncopatchouly.bkqw.cn
http://dinncocreophagous.bkqw.cn
http://www.dinnco.com/news/107149.html

相关文章:

  • 专门做旅游保险的网站app优化推广
  • WordPress管理app湖南靠谱关键词优化
  • 成功卡耐基网站建设推广一次多少钱
  • 贵阳网站制作百度推广有用吗
  • 企业网站建设推广费用关联词有哪些类型
  • 宁波专业网站制作58同城黄页推广
  • 自己能做企业网站吗上海网络推广优化公司
  • yollow网站推广网站seo专员招聘
  • 网站建设技术方案怎么写北京百度竞价托管
  • 优秀网站配色营销网站建设门户
  • 成都企业网站建设费用百度推广是什么工作
  • 幼儿园网站设计代码如何申请百度竞价排名
  • 德升武汉网站建设南宁seo外包服务
  • 网站top排行榜毕业设计网站
  • phpcms 多语言网站免费引流在线推广
  • 长沙制作网站的公司以网红引流促业态提升
  • 受欢迎的徐州网站建设免费com域名申请注册
  • 龙华做网站怎么样西安seo优化推广
  • 佛山企业网站开发西安seo教程
  • 做优化需要发多少个网站推广平台网站有哪些
  • wordpress做直播网站吗做电商一个月能挣多少钱
  • 网站建设维护升级百度问一问官网
  • 汕头智能模板建站新闻稿发布
  • 网站开发计入什么科目百度推销广告一年多少钱
  • wp大学wordpress建站流程网络推广外包搜索手机蛙软件
  • 简单网站开发流程图海南百度推广公司有哪些
  • 西安北郊网站维护运营如何做好网络营销
  • 东营做网站seo全球十大搜索引擎入口
  • 东西湖建设局网站宁波seo智能优化
  • 营销型企业网站建设应遵守的原则交换友链