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

Python 检查用户名可用性-处理AJAX请求(Google App Engine),python,ajax,google-app-engine,memcached,google-cloud-datastore,Python,Ajax,Google App Engine,Memcached,Google Cloud Datastore,我想使用AJAX在我的注册页面上添加“检查可用用户名”功能。我对我应该如何实施它几乎没有疑问 我应该在哪个事件中注册AJAX请求?我们可以发送 当用户焦点超出“用户名”输入字段时请求(模糊 事件)或他键入时(键控事件)。哪个提供了更好的用户体验 经验 在服务器端,处理请求的简单方法是 查询我的主要“帐户”数据库。但这可能导致很多问题 请求访问我的数据库的次数(如果我们使用keyup发布,则次数会更多) 事件)。我应该为注册用户名维护一个单独的模型吗 只有这样才能得到更好的结果 在这种情况下可以使

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

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

  • 在服务器端,处理请求的简单方法是 查询我的主要“帐户”数据库。但这可能导致很多问题 请求访问我的数据库的次数(如果我们使用keyup发布,则次数会更多) 事件)。我应该为注册用户名维护一个单独的模型吗 只有这样才能得到更好的结果

  • 在这种情况下可以使用Memcache吗?正在使用初始化缓存 每个用户名作为密钥,并在注册用户和使用 随机键,用于检查缓存是否已实际初始化或是否通过 直接向数据库查询


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

    我还建议维护一个注册用户名的memcache,以减少数据库命中率并改善用户体验——虽然可能不会用热身来填充它,但只能在发出请求时使用。这有时被称为“存储库”模式

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

    在实际执行注册时,应始终直接检查数据库/数据存储。理想情况下,采用某种事务性方法,这样您就不会有多人注册的竞争条件


    但是,所有这些工作都取决于几件事,包括你的应用程序有多忙以及你正在使用什么样的数据存储技术

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

    我还建议维护一个注册用户名的memcache,以减少数据库命中率并改善用户体验——虽然可能不会用热身来填充它,但只能在发出请求时使用。这有时被称为“存储库”模式

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

    在实际执行注册时,应始终直接检查数据库/数据存储。理想情况下,采用某种事务性方法,这样您就不会有多人注册的竞争条件

    但是,所有这些工作都取决于几件事,包括你的应用程序有多忙以及你正在使用什么样的数据存储技术

    答案-

  • 检查模糊。如果你在key-up上这样做,你会用不必要的查询敲打你的服务器,让那些还没有完成输入的用户感到恼火,并且可能会延迟输入
  • 如果您的帐户实体非常大,您可能希望创建一个单独的AccountName实体,并在创建真实帐户时创建一个匹配的实体(但这可能是一个不必要的优化)。创建帐户(或AccountName)时,请确保在创建帐户时指定id=name。然后你可以做一个AccountName。通过id(name)快速查看AccountName是否已经被分配,如果它最近被处理过,它会自动从memcache中提取它
  • 默认情况下,当您放置或获取实体时,GAE NDB将自动为您填充memcache。如果你按照我在第二步中的建议去做,事情会很快发生,你就不必在预先填充memcache的过程中乱来
  • 如果您担心两个人同时请求相同的用户名,请将您的创建方法放在事务中:

    @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()
    
    答复-

  • 检查模糊。如果你在key-up上这样做,你会用不必要的查询敲打你的服务器,让那些还没有完成输入的用户感到恼火,并且可能会延迟输入
  • 如果您的帐户实体非常大,您可能希望创建一个单独的AccountName实体,并在创建真实帐户时创建一个匹配的实体(但这可能是一个不必要的优化)。创建帐户(或AccountName)时,请确保在创建帐户时指定id=name。然后你可以做一个AccountName。通过id(name)快速查看AccountName是否已经被分配,如果它最近被处理过,它会自动从memcache中提取它
  • 默认情况下,当您放置或获取实体时,GAE NDB将自动为您填充memcache。如果你按照我在第二步中的建议去做,事情会很快发生,你就不必在预先填充memcache的过程中乱来
  • 如果您担心两个人同时请求相同的用户名,请将您的创建方法放在事务中:

    @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()
    

    我正在使用AppEngine数据存储(问题标签中提到了它,但我将在问题中编辑并添加它)。在这种情况下,我们应该如何处理过时的缓存。如果两个用户尝试使用相同的用户名注册,其中一个被注册,另一个被db拒绝(尽管我们的缓存查询说用户名可用)?这是使用memcache的一个可以接受的怪癖吗?正如前面提到的,我建议您只缓存“使用过的”用户名。这意味着比赛条件将是罕见的。如果在事务块中实际创建,则不允许使用相同的名称创建2个用户。我使用的是App Engine数据存储(问题标签中提到了这一点,但我将在问题中编辑并添加)。在这种情况下,我们应该如何处理过时的缓存。如果两个用户尝试使用相同的用户名注册,其中一个被注册,另一个被db拒绝(尽管我们的缓存查询说用户名可用)?这是一个可以接受的使用memcache的怪癖吗?如前所述,我建议您只使用cac