检查用户名可用性 - 处理AJAX请求(Google App Engine)

时间:2015-02-24 17:31:07

标签: python ajax google-app-engine memcached google-cloud-datastore

我想使用AJAX在我的注册页面上添加“检查用户名可用”功能。我对我应该如何实现它的方式几乎没有怀疑。

  1. 我应该在哪个事件中注册我的AJAX请求?我们可以发送 当用户关注“用户名”输入字段时出现请求(模糊 事件)或他键入(键盘事件)。这提供了更好的用户 经验?

  2. 在服务器端,处理请求的简单方法是 查询我的主要“帐户”数据库。但这可能会导致很多 请求命中我的数据库(如果我们使用keyup进行POST,则更多 事件)。我应该为注册的用户名维护一个单独的模型 只是并使用它来获得更好的结果?

  3. 在这种情况下是否可以使用Memcache?使用初始化缓存 每个用户名作为密钥,并在我们注册用户并使用时更新它 随机密钥检查缓存是否实际初始化或通过 直接查询db。

2 个答案:

答案 0 :(得分:2)

我建议使用用户名字段的模糊事件,并结合某种内联错误/警告显示。

我还建议维护注册用户名的内存缓存,以减少数据库命中并改善用户体验 - 尽管可能不会通过预热来填充此内容,而是仅在请求时填充。这有时被称为“存储库”模式。

但是,您只能使用USED用户名填充缓存 - 您不应在此处存储“可用”用户名(或者,如果使用,则使用更低的超时)。

在实际执行注册时,您应该始终直接检查DB / Datastore。理想情况下,在某种交易方法中,您不会有多人登记的竞争条件。

但是,所有这些工作都取决于几个方面,包括您的应用程序的繁忙程度以及您正在使用的数据存储技术!

答案 1 :(得分:2)

答案 -

  1. 检查模糊。如果你在按键操作时执行此操作,您将使用不必要的查询锤击您的服务器,使尚未完成输入的用户烦恼,并且可能无论如何都会延迟打字。
  2. 如果您的帐户实体非常大,您可能需要创建一个单独的AccountName实体,并在创建真实帐户时创建匹配的此类实体(但这可能是不必要的优化)。创建帐户(或AccountName)时,请确保在创建帐户时指定id = name。然后你可以做一个AccountName.get_by_id(名称)来快速查看是否已经分配了AccountName,如果最近处理了它,它会自动从memcache中提取它。
  3. 默认情况下,GAE NDB会在您放置或获取实体时自动为您填充内存缓存。如果你按照我在第2步中的建议行事,那么事情会非常快,你不必为预先填充的memcache而烦恼。
  4. 如果您担心两个人同时请求相同的用户名,请将您的create方法放在一个事务中:

    @classmethod
    @ndb.transactional()
    def create_account(cls, name, other_params):
        acct = Account.get_by_id(name)
        if not acct:
            acct = Account(id=name, other param assigns)
            acct.put()