服务器端表单验证与POST数据
我这里有一个用户输入表单:
http://www.7bks.com/create(需要谷歌登录)
当你第一次创建一个列表时,会要求你创建一个公开的用户名。不幸的是,目前没有限制这个用户名必须是唯一的。我正在编写代码来确保用户名的唯一性,想知道最好的实现方法是什么。
技术细节:appengine,python,webapp框架
我计划的步骤大致是这样的:
- 首先,/create 表单会把数据发送到 /inputlist/(这和现在的操作是一样的)
- /inputlist/ 会查询数据库,看这个用户名是否已经存在。如果存在,就会重定向回 /create
- 然后显示 /create 页面,所有信息和之前一样,但会多出一条错误信息:“这个用户名已经被使用”
我的问题是:
- 这样处理服务器端验证是否是最好的方法?
- 在我验证和修改用户名的时候,存储列表信息的最佳方式是什么?
我认为我有三种存储列表信息的选择,但不确定哪种是“最好”的:
- 把列表信息存储在会话 cookie 中(我使用 GAEsessions 来处理 cookies)
- 为 /create 定义一个单独的 POST 类,并将列表数据从 /inputlist/ 发送回 /create 页面(目前 /create 只有一个 GET 类)
- 把列表存储在数据库中,即使用户名不是唯一的。
非常感谢你的帮助 :)
我对 python 和编程整体还很陌生,如果我漏掉了什么明显的东西,真心抱歉。
汤姆
PS - 我相信我最终能搞明白,但我找不到关于使用 webapp appengine 框架进行数据 POST 的任何文档,而这正是我需要的,以便实现上面第二种方案 :s 也许你能指点我一下?谢谢!
PPS - 现在有点过时了,但你可以在这里大致看到 /create 和 /inputlist/ 的代码是如何工作的:7bks.com Gist
2 个回答
你可以使用Django的表单验证功能(我觉得这个功能应该能帮你把这些事情都处理得更简单): http://code.google.com/appengine/articles/djangoforms.html
在那个页面里搜索“添加一个项目” - 它会自动处理错误(我觉得这可能包括用户名不唯一的情况)。
警告:我也是个初学者... :)
我会用Ajax来做初步的验证。比如,当用户在输入框中输入用户名后,离开这个输入框时,我会在后台向服务器发送一个请求,询问这个用户名是否可以使用,并将结果清晰地反馈给用户。
如果做得好,通过Ajax进行表单验证会让用户体验非常棒。
当然,在任何数据被保存之前,我一定会在服务器端重新进行验证,以避免请求被伪造。
如果你感兴趣,jQuery有一个很不错的表单验证插件。你可以查看这个链接:http://docs.jquery.com/Plugins/validation。
在我的职业生涯中,我从来没有遇到过需要同时在服务器端和客户端进行验证的情况。
关于存储列表(在你将其保存到数据存储之前)。如果你使用Ajax来验证用户名,可以在有效的用户名填写之前将其他字段禁用。不要允许用户提交一个无效的用户名!
这样可能会解决你大部分情况下的问题。不过,也有可能在用户填写书单的时候,其他人抢走了这个用户名。如果你想解决这个问题,我建议直接展示用户请求时发送给你的列表。用户刚刚把它发给你,你不需要把它保存到其他地方。