关于 flask 处理数据的问题

2016-06-16 21:39:19 +08:00
 seoguess
最近刚开始研究 flask ,跟着网上的实例,结合自己的想法在练习。

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

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

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





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

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

本来 request.form['delete'] 应该抛出 KeyError 的异常的,我想可能是 Flask 或者 werkzeug 把异常吞了,然后抛出 400 的 HTTP 错误来
neo1218
2016-06-17 01:18:00 +08:00
如果 debug 开了,应该是会显示 KEYError 的
skydiver
2016-06-17 02:40:31 +08:00
这不应该第一反应去看错误日志么……
而且奇怪这种时候为什么会返回 400 ,按理说 500 才对
binux
2016-06-17 03:13:53 +08:00
@skydiver flask 对于使用 __getitem__ 访问的 request.form 认为是必要参数。如果客户端没有传递必要参数,当然是 400 了。
garytqq
2016-06-17 07:52:57 +08:00
form 表单里没有 name='delete'的表单项吧,<input type='hidden' name='delete' value='delete' />
9hills
2016-06-17 08:04:39 +08:00
非强制参数要用 dict get
seoguess
2016-06-17 08:46:48 +08:00
@cloverstd 原来是这样子,明白了!谢谢!
seoguess
2016-06-17 08:47:46 +08:00
@neo1218
@binux
@skydiver
@neo1218
@9hills 谢谢你们,问题解决啦。
rockivy
2016-06-17 10:32:59 +08:00
建议看看 flask-appbuilder ( https://github.com/dpgaspar/Flask-AppBuilder
建好 model 之后,只需要简单几行 View 配置代码,
就可以直接生成 CRUD 页面及功能,简直是 demo 和各种 mini 项目开发的神器。
seoguess
2016-06-17 11:18:23 +08:00
@rockivy 谢谢,我研究一下。

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

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

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

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

© 2021 V2EX