关于 Python 后端验证参数 的界限 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sichuyoudang312
V2EX    Python

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

  •  
  •   sichuyoudang312 2020-04-22 11:10:35 +08:00 4107 次点击
    这是一个创建于 2077 天前的主题,其中的信息可能已经有所发展或是发生改变。
    关于参数校验,后端有简单的统一校验格式,主要针对参数类型和长度,其他的又不值得统一的就用 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 字符串,然后出现异常,我是不想改的,所以想问各位验证参数的界限是怎样的
    第 1 条附言    2020-04-22 14:21:09 +08:00
    我当然不会把“服务器异常”这种错误抛出来,我只是直接抛出 "msg": "'>=' not supported between instances of 'str' and 'int'" ,现在问题是测试不管这些错误,觉得既然只支持数值那输入数值以外的要抛出"该参数只支持数值" 这种信息,因为觉得这些信息用户也会看到,我说前端都不会传进来这样的数据,我当然就只校验部分类型了,offset 之前我是校验数值类型的,测试输入 -460,,,我真。。。

    此外,我说的不是只有这一个接口,而是类似的
    23 条回复    2020-04-24 18:12:19 +08:00
    undertonememorie
        1
    undertonememorie  
       2020-04-22 11:16:27 +08:00
    voluptuous Schema 校验 规定字段类型和长度,测试人员肯定冲着搞崩你接口的心态去测试,你要保证系统的健壮性
    ClericPy
        2
    ClericPy  
       2020-04-22 11:18:17 +08:00
    我以前做的和 Fastapi 里用 pydantic 实现的差不多, 现在用的 Fastapi.......
    wangyzj
        3
    wangyzj  
       2020-04-22 11:22:06 +08:00
    marshmallow
    ipwx
        4
    ipwx  
       2020-04-22 11:26:38 +08:00
    FastApi,你值得拥有
    sichuyoudang312
        5
    sichuyoudang312  
    OP
       2020-04-22 11:36:11 +08:00
    @undertonememorie 我接口也想写的健壮些,文档里面写了 offset <int> <可选> 分页偏移量,默认 0,结果测试非输入字符串,那就抛异常了
    sichuyoudang312
        6
    sichuyoudang312  
    OP
       2020-04-22 11:37:11 +08:00
    @ClericPy 因为这事发了帖子,发现了 pydantic,我不改了,我要去研究 pydantic
    sichuyoudang312
        7
    sichuyoudang312  
    OP
       2020-04-22 11:42:06 +08:00
    @ipwx 学习了
    bnm965321
        8
    bnm965321  
       2020-04-22 11:57:30 +08:00
    出现异常当然要改,至少要把异常以错误的形式回馈
    also24
        9
    also24  
       2020-04-22 12:01:45 +08:00
    offset 过大这件事,感觉应该在业务代码中处理,而不是入参时处理吧
    johnsona
        10
    johnsona  
       2020-04-22 12:35:02 +08:00
    marshlallow+webargs,也是 schema 和我一起念,skema
    Vegetable
        11
    Vegetable  
       2020-04-22 12:38:46 +08:00
    生产服务器的所有异常都必须被捕获,无论任何情况都不能让上层报 500 Internal Error
    我还以为这是后端开发的基本常识。
    guyskk0x0
        12
    guyskk0x0  
       2020-04-22 12:55:37 +08:00 via Android
    SingeeKing
        13
    SingeeKing  
    PRO
       2020-04-22 13:01:40 +08:00
    “然后出现异常” 难道你的路由分发那里没有做错误捕获处理吗。。。
    zhangqilin
        14
    zhangqilin  
       2020-04-22 13:31:12 +08:00
    Flask 有个 Valid 对象
    我之前就是参照这个写了个 DjangoValid
    给公司自己的项目用的
    万幸很好用
    sichuyoudang312
        15
    sichuyoudang312  
    OP
       2020-04-22 13:45:22 +08:00
    @Vegetable 当然不会让它报 500 了
    johnsona
        16
    johnsona  
       2020-04-22 14:16:35 +08:00
    @Vegetable 假设捕捉到下层一个未知的错误,上层应该怎么处理然后返回给前端
    Vegetable
        17
    Vegetable  
       2020-04-22 15:38:28 +08:00   1
    @jsisjs20130824 一般我会在最外层做一个捕获所有异常的中间件, 然后向客户端返回{code:500,msg:未知错误},然后日志写入堆栈信息.
    Vegetable
        18
    Vegetable  
       2020-04-22 15:43:10 +08:00
    我觉得测试说的有点道理, 我为了避免这种问题,会直接返回参数异常,最多返回一下哪个字段异常了,不会返回为什么异常了.这样就避免了过于细致的类型判断.不过你引入框架的话,往往能够细致而不失优雅的解决.
    ps1aniuge
        19
    ps1aniuge  
       2020-04-22 17:52:52 +08:00
    我觉得测试说的对,严谨些,让别人挑不出毛病。
    superrichman
        20
    superrichman  
       2020-04-22 18:12:49 +08:00 via iPhone
    是你的参数转换的问题,接口健壮性不够强
    hell0v2
        21
    hell0v2  
       2020-04-22 19:05:04 +08:00
    一般业务层做处理,不过接口也要 catch 住吧;反正不管怎么协调,前端输入异常的情况下,要有合理的返回
    forkc
        22
    forkc  
       2020-04-22 19:10:04 +08:00
    wtform
    johnsona
        23
    johnsona  
       2020-04-24 18:12:19 +08:00
    @Vegetable 我猜也是,我用的框架可以把 500 注册下来,然后改写返回格式,状态码之类的。比较好奇是统一 200,然后 json 格式统一,是为了方便前端判断去解决吗?抛开日志不说,肯定会打日志
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3007 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 13:14 PVG 21:14 LAX 05:14 JFK 08:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86