Mongoengine中Required=True验证规则不生效,缺失必填字段的文档仍可存入数据库
问题原因与解决方案
嗨,我一眼就看到你问题的症结啦——这是个大小写导致的小失误!
核心错误:参数名大小写错误
MongoEngine里控制字段必填的参数是小写的required,但你代码里写的是大写的Required=True。这个大写的参数会被MongoEngine当成自定义的额外属性,而不是生效的必填验证规则,所以即使缺失songName这类字段,文档依然能被存入数据库。
修正后的Song类代码
class Song(db.Document): # 把 Required=True 改成 required=True Id = db.IntField(min_value=0, unique=True, required=True) songName = db.StringField(unique=True, max_length=100, required=True) def json(self): song_dict = { "Id": self.Id, "songName": self.songName } return json.dumps(song_dict) meta = { "indexes": ["Id"], "ordering": ["-date_created"] }
额外的代码优化建议
除了这个必填字段的问题,你的代码还有几个可以改进的地方:
避免使用
eval(),存在安全风险
直接用eval(audioFileType)非常危险,如果攻击者传入恶意的audioFileType值,可能会执行任意代码。建议用字典映射的方式来关联类型和对应的文档类:# 先定义类型映射字典 audio_type_map = { "Song": Song # 以后添加其他类型(比如Podcast、Audiobook)也在这里加 } # 然后在路由里替换eval的逻辑 if _json['audioFileType'] in audio_type_map: audio_cls = audio_type_map[_json['audioFileType']] record = audio_cls(**_json['audioFileMetadata']) record.save() # ... 后续逻辑增强请求数据验证
除了依赖MongoEngine的字段验证,建议在接收请求时先做一层前置验证,比如检查audioFileMetadata里的必要键是否存在,避免因为数据格式问题触发不必要的异常。
Stack Overflow发帖格式小建议
你的帖子整体已经很清晰了,再提两个小细节会更完美:
- 给代码块指定语言(比如
python、json),这样代码会有语法高亮,可读性更强 - 可以补充说明你使用的MongoEngine和Flask版本,有时候版本差异也会导致奇怪的问题
内容的提问来源于stack exchange,提问作者Yash viroja
相关产品推荐
相关产品推荐

