关于 Python 后端验证参数 的界限

2020-04-22 11:10:35 +08:00
 sichuyoudang312
关于参数校验,后端有简单的统一校验格式,主要针对参数类型和长度,其他的又不值得统一的就用 lambda 进行校验,如下,只需

{
"name": ("名称", "optional str 30"),
"limit": ("每次获取条数", lambda x: x is None or x in range(101)),
"offset": ("分页偏移量", lambda x: x is None or x >= 0)
}

像 limit 我设置了 100 以内的数值型,offset 因为总数据可能很大,就没设置上限 , 结果测试人员 非要验证 offset 字符串,然后出现异常,我是不想改的,所以想问各位验证参数的界限是怎样的
3545 次点击
所在节点    Python
23 条回复
undertonememorie
2020-04-22 11:16:27 +08:00
voluptuous Schema 校验 规定字段类型和长度,测试人员肯定冲着搞崩你接口的心态去测试,你要保证系统的健壮性
ClericPy
2020-04-22 11:18:17 +08:00
我以前做的和 Fastapi 里用 pydantic 实现的差不多, 现在用的 Fastapi.......
wangyzj
2020-04-22 11:22:06 +08:00
marshmallow
ipwx
2020-04-22 11:26:38 +08:00
FastApi,你值得拥有
sichuyoudang312
2020-04-22 11:36:11 +08:00
@undertonememorie 我接口也想写的健壮些,文档里面写了 offset <int> <可选> 分页偏移量,默认 0,结果测试非输入字符串,那就抛异常了
sichuyoudang312
2020-04-22 11:37:11 +08:00
@ClericPy 因为这事发了帖子,发现了 pydantic,我不改了,我要去研究 pydantic
sichuyoudang312
2020-04-22 11:42:06 +08:00
@ipwx 学习了
bnm965321
2020-04-22 11:57:30 +08:00
出现异常当然要改,至少要把异常以错误的形式回馈
also24
2020-04-22 12:01:45 +08:00
offset 过大这件事,感觉应该在业务代码中处理,而不是入参时处理吧
johnsona
2020-04-22 12:35:02 +08:00
marshlallow+webargs,也是 schema 和我一起念,skema
Vegetable
2020-04-22 12:38:46 +08:00
生产服务器的所有异常都必须被捕获,无论任何情况都不能让上层报 500 Internal Error
我还以为这是后端开发的基本常识。
guyskk0x0
2020-04-22 12:55:37 +08:00
SingeeKing
2020-04-22 13:01:40 +08:00
“然后出现异常” 难道你的路由分发那里没有做错误捕获处理吗。。。
zhangqilin
2020-04-22 13:31:12 +08:00
Flask 有个 Valid 对象
我之前就是参照这个写了个 DjangoValid
给公司自己的项目用的
万幸很好用
sichuyoudang312
2020-04-22 13:45:22 +08:00
@Vegetable 当然不会让它报 500 了
johnsona
2020-04-22 14:16:35 +08:00
@Vegetable 假设捕捉到下层一个未知的错误,上层应该怎么处理然后返回给前端
Vegetable
2020-04-22 15:38:28 +08:00
@jsisjs20130824 一般我会在最外层做一个捕获所有异常的中间件, 然后向客户端返回{code:500,msg:未知错误},然后日志写入堆栈信息.
Vegetable
2020-04-22 15:43:10 +08:00
我觉得测试说的有点道理, 我为了避免这种问题,会直接返回参数异常,最多返回一下哪个字段异常了,不会返回为什么异常了.这样就避免了过于细致的类型判断.不过你引入框架的话,往往能够细致而不失优雅的解决.
ps1aniuge
2020-04-22 17:52:52 +08:00
我觉得测试说的对,严谨些,让别人挑不出毛病。
superrichman
2020-04-22 18:12:49 +08:00
是你的参数转换的问题,接口健壮性不够强

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/664913

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX