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

关于 flask 处理数据的问题

  •  
  •   seoguess · 2016-06-16 21:39:19 +08:00 · 4163 次点击
    这是一个创建于 3087 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近刚开始研究 flask ,跟着网上的实例,结合自己的想法在练习。

    但遇到一个很纠结的问题,愣是没想明白究竟哪里出错。当我进入文章的编辑页面,如果没有注释掉 if request.form['delete'] == 'delete':这段语句,前台修改数据就会返回 400 错误。

    如果是点选了‘ delete ’这个单选框,又可以正常的重定向到 show_all 页面。

    为了避免格式混乱,我截了两张图。





    求解惑,谢谢!
    15 条回复    2016-06-17 11:18:23 +08:00
    ryd994
        1
    ryd994  
       2016-06-16 21:43:18 +08:00 via Android
    注释掉之后有没有调整缩进?
    cloverstd
        2
    cloverstd  
       2016-06-16 21:44:34 +08:00   ❤️ 1
    if request.form.get('delete') == 'delete':
    seoguess
        3
    seoguess  
    OP
       2016-06-16 21:46:13 +08:00
    @ryd994 注释掉后是可以正常编辑的,编辑完成后会重定向到 show_all 页面。如果没有注释掉,那么进入编辑页面之后,修改内容之后,点击提交就会返回 400 错误。但是如果勾选删除的单选框,就可以删除内容,然后跳转到 show_all 页面。

    就是二选一的情况,让我很纠结。
    zuo
        4
    zuo  
       2016-06-16 21:46:38 +08:00
    @cloverstd 哈哈哈哈
    seoguess
        5
    seoguess  
    OP
       2016-06-16 21:57:18 +08:00
    @cloverstd 谢谢!为啥用了.get 方法就可以了?我记得是通用的呀,只是使用.get 方法在不存在该字段的时候不会报错....
    cloverstd
        6
    cloverstd  
       2016-06-16 22:53:30 +08:00
    @seoguess 你的 delete 是 checkbox ,当不选中时,是不会提交到服务器的,你可以打开 Chrome 的 dev-tool 抓包一下看

    本来 request.form['delete'] 应该抛出 KeyError 的异常的,我想可能是 Flask 或者 werkzeug 把异常吞了,然后抛出 400 的 HTTP 错误来
    neo1218
        7
    neo1218  
       2016-06-17 01:18:00 +08:00
    如果 debug 开了,应该是会显示 KEYError 的
    skydiver
        8
    skydiver  
       2016-06-17 02:40:31 +08:00 via iPad
    这不应该第一反应去看错误日志么……
    而且奇怪这种时候为什么会返回 400 ,按理说 500 才对
    binux
        9
    binux  
       2016-06-17 03:13:53 +08:00   ❤️ 1
    @skydiver flask 对于使用 __getitem__ 访问的 request.form 认为是必要参数。如果客户端没有传递必要参数,当然是 400 了。
    garytqq
        10
    garytqq  
       2016-06-17 07:52:57 +08:00
    form 表单里没有 name='delete'的表单项吧,<input type='hidden' name='delete' value='delete' />
    9hills
        11
    9hills  
       2016-06-17 08:04:39 +08:00
    非强制参数要用 dict get
    seoguess
        12
    seoguess  
    OP
       2016-06-17 08:46:48 +08:00
    @cloverstd 原来是这样子,明白了!谢谢!
    seoguess
        13
    seoguess  
    OP
       2016-06-17 08:47:46 +08:00
    @neo1218
    @binux
    @skydiver
    @neo1218
    @9hills 谢谢你们,问题解决啦。
    rockivy
        14
    rockivy  
       2016-06-17 10:32:59 +08:00
    建议看看 flask-appbuilder ( https://github.com/dpgaspar/Flask-AppBuilder
    建好 model 之后,只需要简单几行 View 配置代码,
    就可以直接生成 CRUD 页面及功能,简直是 demo 和各种 mini 项目开发的神器。
    seoguess
        15
    seoguess  
    OP
       2016-06-17 11:18:23 +08:00
    @rockivy 谢谢,我研究一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3457 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:49 · PVG 12:49 · LAX 20:49 · JFK 23:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.