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 · 3562 次点击
    这是一个创建于 1680 天前的主题,其中的信息可能已经有所发展或是发生改变。
    关于参数校验,后端有简单的统一校验格式,主要针对参数类型和长度,其他的又不值得统一的就用 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  
       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   ·   实用小工具   ·   3431 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:15 · PVG 19:15 · LAX 03:15 · JFK 06:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.