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
Achilless
V2EX  ›  Python

为什么后端要写 form,前端直接写好 form 再传不是很方便么

  •  
  •   Achilless · 2020-09-11 14:30:29 +08:00 · 4661 次点击
    这是一个创建于 1294 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前了解的 flask,django 都有后端表单功能,不是很理解存在的意义

    24 条回复    2020-09-29 01:50:29 +08:00
    xiaolinjia
        1
    xiaolinjia  
       2020-09-11 14:39:43 +08:00
    不写 form,怎么接收前端表单传的数据?
    如果你说的是后端来定义 form 的样式,这个是之前历史需要,现在基本不用。
    Achilless
        2
    Achilless  
    OP
       2020-09-11 15:16:41 +08:00
    @xiaolinjia 接收 request 对象不可以么
    xiaolinjia
        3
    xiaolinjia  
       2020-09-11 15:31:23 +08:00
    @Achilless flask 我用的少就先不论。dj 的话,form 类主要有两个功能,1 是验证数据,2 是前端生成表单(这个上面已经说了是历史产物了,现在基本不用)。
    那说回 1,接收数据,直接从 request.POST 或者 request.body 里接收确实可以,但是还要另外写验证,就很麻烦。如果用 form 类的话,首先在 model 里能定义一些字段约束,并且 form 类里还能定义 clean_xx 方法来验证。这些验证,只需要调用 form.is_valid()。然后 form.cleaned_data,就可以获取到验证通过的数据,因为框架帮你写好了。
    而如果你直接取,那就是 a = request.POST.get('a'),if 验证(a): xxxxx 。b = request.POST.get('b'),if 验证(b): xxxxx 。这样写不麻烦吗?
    Achilless
        4
    Achilless  
    OP
       2020-09-11 15:45:34 +08:00
    @xiaolinjia 我验证 form 都是在前端写好再传的。。觉得比写 form.py 轻松许多,所以怀疑后端设计 form 的意义
    Haujilo
        5
    Haujilo  
       2020-09-11 15:54:13 +08:00
    楼主的意思是既然前端的定义数据格式,不理解为啥后端还要再定义一次?后端开发要默认前端传输的数据都是不可信的,必须自定义好格式并验证。
    leopod1995
        6
    leopod1995  
       2020-09-11 15:55:12 +08:00
    做后端就要有 前端所有数据都不可信 的心态
    zacharyjia
        7
    zacharyjia  
       2020-09-11 15:58:24 +08:00   ❤️ 2
    @Achilless 不要相信前端传来的数据,所有验证一定要在后端做好。前端的验证只是为了提高用户体验的。
    lasuar
        8
    lasuar  
       2020-09-11 16:06:40 +08:00
    遇到不理解的设计先提问 是个好习惯
    lovecy
        9
    lovecy  
       2020-09-11 16:07:26 +08:00
    前端验证是提高用户体验,减少无效请求的
    后端验证是防错防攻击
    lovecy
        10
    lovecy  
       2020-09-11 16:07:55 +08:00
    前端代码是公开的,所有请求都是可以伪造的,不可信任前端传来的数据
    xiaolinjia
        11
    xiaolinjia  
       2020-09-11 16:33:04 +08:00
    @Achilless 你前端 js 验证的话,某种程度上是可以防止那些操作浏览器的正经用户乱输。那我直接 postman 请求接口,不是把你前端绕过了,那我后端还要不要验证啊。
    或者说,我直接 request 库向 api 接口发请求 post 数据,有经过你的前端表单?
    sixway
        12
    sixway  
       2020-09-11 16:52:26 +08:00
    一般来说前端的 From 是可以像你说的。不过前端的数据毕竟不可信,验证也只是防君子。想做坏事的成本可太低了。
    L00kback
        13
    L00kback  
       2020-09-11 16:52:45 +08:00
    你前端搞好了,传给后端的时候黑客把数据包一截,爱怎么改怎么改。
    功能是没问题的,安全性太低了。
    clf
        14
    clf  
       2020-09-11 16:59:56 +08:00
    @Achilless 只做前端验证是不够的。

    1.像上面说的那样完全可以用 postman 等工具直接请求你的接口,往接口里写入一堆对业务会造成极大干扰的数据。
    2.前端的代码是可以被修改的(比如网页,我去掉前端的验证表单的 js 代码,直接请求就可以了)
    3.网络传输的不可靠,如果采用明文传输,在中间过程中可以被修改。
    gollwang
        15
    gollwang  
       2020-09-11 17:14:18 +08:00
    前段验证在程序员眼中==没有
    kalluwa
        16
    kalluwa  
       2020-09-11 17:33:01 +08:00
    面向黑客编程?
    oneend
        17
    oneend  
       2020-09-11 17:46:24 +08:00
    前端的数据一定要像 女人的嘴骗人的鬼 那样对待
    wuwukai007
        18
    wuwukai007  
       2020-09-11 18:51:57 +08:00 via Android
    django-drf,表单验证默秒全
    saulshao
        19
    saulshao  
       2020-09-11 21:10:56 +08:00
    出于安全考虑,后端应该把所有接收的输入再验证一遍。并且有一些数据的有效性是只有后端才知道的。
    muuubooo
        20
    muuubooo  
       2020-09-12 14:08:48 +08:00
    我的经验理解是前端验证是软验证,更多的是防止用户无恶意的错误填写,和规范数据格式。
    就像某扇门上贴着非请勿入的一纸告示,但门本身没上锁。
    lslqtz
        21
    lslqtz  
       2020-09-13 02:33:30 +08:00
    前端验证可以降低不必要的服务器请求,同时提升用户体验
    后端验证可以防止前端写出 bug 导致没有进行验证,同时也可以防止恶意接口请求,并且可以进行一些增强验证(例如说注册这个功能,你前端是不知道账号存在不存在的,而后端做注册逻辑的时候肯定是要去数据库先查表的)
    soulmt
        22
    soulmt  
       2020-09-13 10:23:51 +08:00
    不要相信前端!!!不要相信前端!!!不要相信前端!!!前端给什么都不要相信!真的!!
    OHyn
        23
    OHyn  
       2020-09-13 16:14:17 +08:00
    所有验证,后端都需要进行。。前端防君子不防小人的。
    sxy960806
        24
    sxy960806  
       2020-09-29 01:50:29 +08:00 via Android
    可以换一个问题,后端写了 form 为什么数据库还要再检验一遍?理解了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3103 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:55 · PVG 20:55 · LAX 05:55 · JFK 08:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.