请教大家一个django注册的诡异问题。

2013-10-12 19:44:30 +08:00
 clker
在 Sina App Engine 节点发了贴 http://www.v2ex.com/t/85265 ,无奈那里人气不足,只能在这里再发一次. 请教各位大大了。
3230 次点击
所在节点    Python
17 条回复
jokaye
2013-10-12 20:05:46 +08:00
先用django form重构一下吧, 大部分逻辑都帮你弄好了,一个劲的 XXX = request.POST.XXX 真揪心
clker
2013-10-12 20:11:23 +08:00
@jokaye 谢谢建议,不过不太喜欢 django form, 而且前端用的bootstrap,form也不好用。
jokaye
2013-10-12 20:37:40 +08:00
@clker 那就用AJAX啊...AJAX里调用form validation, 这个跟用什么前端框架没关系
hepochen
2013-10-12 20:45:27 +08:00
建议1,不要堆积垃圾代码
username = request.POST.get('username', '').strip()
这行代码能代替你原来的5行代码,如果你需要取的变量很多,那么,这样的代码也会成为垃圾代码,需要自己另写一个常用的以应对

建议2,有意义比简短更重要
pwd_blank 不如 pwd_is_blank, pwd_is_blank = 1 不如 pwd_is_blank = True

建议3, 既然用了Django,就应该了解它最基础的逻辑
我如果记得没错的话,User.objects.filter(username = username)这样返回的一个QuerySet对象,如果用if去判断,那么永远都相当于 True,应该是User.objects.filter(username = username).count(), 是这样么?

建议4, 不要妄下判断,以目前的水平,多数的问题是出在自己的身上
“先if 和 else 均被执行,而且还是先执行else” --> 这样的结论如果成立,你可以给python的核心库打补丁了。

建议5, 不要说本地没问题,不要把问题强加给不相关的方面
呃,你看下自己的数据库,里面的数据可能跟自己想的也不一样。归根结底是表面的逻辑出问题了。对,这个跟SAE也无关。

建议6,还没有学会如何DEBUG吧?
xiaket
2013-10-12 21:00:24 +08:00
@hepochen


建议3, 既然用了Django,就应该了解它最基础的逻辑
我如果记得没错的话,User.objects.filter(username = username)这样返回的一个QuerySet对象,如果用if去判断,那么永远都相当于 True,应该是User.objects.filter(username = username).count(), 是这样么?

如果查询结果为空, 是可以为False的.
hepochen
2013-10-12 21:04:05 +08:00
@xiaket 嗯,如果这样的话,那是我的错。 :) @clker 那你应该看一下自己的数据库中,是否数据都进去了,另外,在程序执行的时候,打上断点,就清楚其执行逻辑了。
clker
2013-10-12 21:04:42 +08:00
@hepochen 非常感谢这么详细的建议。

关于建议1, 非常感谢!还没有用过strip,掩面。。。。

关于建议2, 非常感谢!这方面确实欠缺。

关于建议3, 我知道filter是返回一个QuerySet,不过一个空的QuerySet会被判为False的。当然大大的建议更好。

关于建议4,确实没有怀疑过SAE或者CPython,所以请大大们帮忙看下代码有什么漏洞。

关于建议5,本地确实是没有问题。另外,数据库的数据确实看了,确实注册成功了,图片也存进去了。就是返回说这个用户名已经注册,但确实是刚刚注册的那个。

关于建议6, 确实debug不是很会。只会看debug页面和log两招。在SAE上面log也确实看到了两个case均被执行。刚刚在google上面搜索了一下,发现django-pdb,去试试。谢谢大大的提醒。
cj1324
2013-10-12 21:07:33 +08:00
@clker

前端用的bootstrap,form也不好用。 这句话不成立。好好了解form吧。
clker
2013-10-12 21:08:23 +08:00
@hepochen 发现django-pdb只能在本地环境中使用。请问大大是用什么方法加断点的啊?
clker
2013-10-12 21:38:26 +08:00
@cj1324 恩,看到了 django-bootstrap-form。可以试试。
jokaye
2013-10-12 21:42:32 +08:00
@xiaket exists()
clker
2013-10-12 21:53:36 +08:00
@jokaye 恩,exist() 的效率应该高一些。
clker
2013-10-12 21:55:21 +08:00
@jokaye @hepochen @cj1324 话说没有人帮我测试一下吗?

如果不上传头像的话就不会出错,上传的话就就会出错。 http://luezhi.sinaapp.com
clker
2013-10-12 22:27:50 +08:00
太诡异了,有时候没有错,有时候出错。
hepochen
2013-10-13 01:59:58 +08:00
@clker 推荐使用pycharm作为开发工具。剩下的就靠自己吧,可能会艰难一点,但自通了,进步就是极快的。
booksmith
2013-10-13 08:49:25 +08:00
楼主明显没有去了解django的基础,form设计是一个很不错的选择,至少比你手动这样敲代码来得高效多了。
ericls
2013-10-13 09:00:39 +08:00
不能用filter 要用get

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

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

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

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

© 2021 V2EX