服务器端表单验证与POST数据

1 投票
2 回答
2783 浏览
提问于 2025-04-16 09:07

我这里有一个用户输入表单:

http://www.7bks.com/create(需要谷歌登录)

当你第一次创建一个列表时,会要求你创建一个公开的用户名。不幸的是,目前没有限制这个用户名必须是唯一的。我正在编写代码来确保用户名的唯一性,想知道最好的实现方法是什么。

技术细节:appengine,python,webapp框架

我计划的步骤大致是这样的:

  • 首先,/create 表单会把数据发送到 /inputlist/(这和现在的操作是一样的)
  • /inputlist/ 会查询数据库,看这个用户名是否已经存在。如果存在,就会重定向回 /create
  • 然后显示 /create 页面,所有信息和之前一样,但会多出一条错误信息:“这个用户名已经被使用”

我的问题是:

  1. 这样处理服务器端验证是否是最好的方法?
  2. 在我验证和修改用户名的时候,存储列表信息的最佳方式是什么?

我认为我有三种存储列表信息的选择,但不确定哪种是“最好”的:

  1. 把列表信息存储在会话 cookie 中(我使用 GAEsessions 来处理 cookies)
  2. 为 /create 定义一个单独的 POST 类,并将列表数据从 /inputlist/ 发送回 /create 页面(目前 /create 只有一个 GET 类)
  3. 把列表存储在数据库中,即使用户名不是唯一的。

非常感谢你的帮助 :)

我对 python 和编程整体还很陌生,如果我漏掉了什么明显的东西,真心抱歉。

汤姆

PS - 我相信我最终能搞明白,但我找不到关于使用 webapp appengine 框架进行数据 POST 的任何文档,而这正是我需要的,以便实现上面第二种方案 :s 也许你能指点我一下?谢谢!

PPS - 现在有点过时了,但你可以在这里大致看到 /create 和 /inputlist/ 的代码是如何工作的:7bks.com Gist

2 个回答

1

你可以使用Django的表单验证功能(我觉得这个功能应该能帮你把这些事情都处理得更简单): http://code.google.com/appengine/articles/djangoforms.html

在那个页面里搜索“添加一个项目” - 它会自动处理错误(我觉得这可能包括用户名不唯一的情况)。

警告:我也是个初学者... :)

1

我会用Ajax来做初步的验证。比如,当用户在输入框中输入用户名后,离开这个输入框时,我会在后台向服务器发送一个请求,询问这个用户名是否可以使用,并将结果清晰地反馈给用户。

如果做得好,通过Ajax进行表单验证会让用户体验非常棒。

当然,在任何数据被保存之前,我一定会在服务器端重新进行验证,以避免请求被伪造。

如果你感兴趣,jQuery有一个很不错的表单验证插件。你可以查看这个链接:http://docs.jquery.com/Plugins/validation

在我的职业生涯中,我从来没有遇到过需要同时在服务器端和客户端进行验证的情况。

关于存储列表(在你将其保存到数据存储之前)。如果你使用Ajax来验证用户名,可以在有效的用户名填写之前将其他字段禁用。不要允许用户提交一个无效的用户名!

这样可能会解决你大部分情况下的问题。不过,也有可能在用户填写书单的时候,其他人抢走了这个用户名。如果你想解决这个问题,我建议直接展示用户请求时发送给你的列表。用户刚刚把它发给你,你不需要把它保存到其他地方。

撰写回答