Flask Web服务中验证带空格属性的数据对象完整性求助
解决带空格属性名的验证问题
让我来帮你搞定这个属性验证的困扰。首先得理清为什么你之前用in和hasattr都失效了——这和Python的属性命名规则以及你加载JSON的方式直接相关:
当你通过self.__dict__ = json.loads(j)把带空格的JSON键赋值给对象时,这些带空格的名称确实会存在于对象的__dict__字典中,但Python不允许用.访问带空格的属性(比如item.from value是语法错误)。因此hasattr(item, "from value")会返回False,因为它在尝试查找一个符合标识符规则的属性,而非__dict__里的字符串键;而"from value" in item也不生效,因为默认对象没有实现__contains__方法来检查__dict__的键。
正确的验证方式
既然这些属性名实际存储在对象的__dict__字典里,我们直接检查这个字典的键即可。下面是修正后的验证代码:
class DataSetValidator(object): def validate(self, dsList, convert): if not dsList or len(dsList) < 1: raise BadRequest("either Convert List or Data Set Source required.") # 收集所有需要验证的必填字段 required_fields = [ convert.INPUT_CURRENCY, convert.INPUT_AMOUNT, convert.RETURN_CURRENCY, convert.RETURN_VALUE ] for item in dsList: for field in required_fields: # 直接检查对象__dict__字典中是否包含目标键 if field not in item.__dict__: raise BadRequest(f"{field} property not found.") return True
额外优化建议(可选)
如果可以控制输入JSON的格式,或者在加载阶段做预处理,建议把带空格的键转换成符合Python规范的命名(比如用下划线替换空格),这样后续的属性访问和验证都会更顺畅。比如修改DataSetContract的初始化逻辑:
class DataSetContract(object): def __init__(self, j): data = json.loads(j) # 将带空格的键转换为下划线命名 cleaned_data = {key.replace(" ", "_"): value for key, value in data.items()} self.__dict__.update(cleaned_data)
之后只需要同步调整FxConvertContract里的属性名(比如把INPUT_CURRENCY对应的值改成"from_value"),就能用hasattr进行正常验证了。
内容的提问来源于stack exchange,提问作者Abhash786
相关产品推荐
相关产品推荐

