python - 与 GAE 数据库进行强一致性查询以进行注册验证

标签 python google-app-engine consistency ancestor

我正在尝试为用户创建一个简单的注册表。为了使该注册保持一致,我不能允许使用相同的用户名注册两个用户,因为默认查询的最终一致性。我知道即使流量很大,发生这种情况的可能性也几乎为 0,我希望我的实现是可靠的。我已经实现了应该高度一致的祖先查询,但是当我发布我的应用程序并测试它时,如果我时机正确,我可以让它使用相同的用户名注册 2 个用户。

def user_parent(group = 'default'):
key = ndb.Key('users', group)
return key

class User(ndb.Model):
    username = ndb.StringProperty(required = True)
    email = ndb.StringProperty(required = True)
    password = ndb.StringProperty(required = True)

@classmethod
def register(cls, username, password, email):
    return User(parent = user_parent(),
                username = username,
                password = password,
                email = email)

@classmethod
def by_name(cls, name):
    return User.query(User.username == name, ancestor = user_parent()).get()

@classmethod
def by_id(cls, uid):
    return User.get_by_id(uid, parent = user_parent()) 

@classmethod
def by_email(cls, email):
    logging.error(User.query(User.email == email, ancestor = user_parent()).get())
    return User.query(User.email == email, ancestor = user_parent()).get()

@classmethod
def login(cls, user, password):
    u = cls.by_name(user)
    if u and u.password == password:
        return u

我使用 reg_submit 来执行 ajax 请求,我对编程非常陌生,并且怀疑这是最好的解决方案,但我的想法是,在这里我通过对 User 模型类的调用进行验证。

    if reg_submit == 'True':
        reg_email = self.request.get('reg_email')
        reg_user = self.request.get('reg_user')
        reg_password = self.request.get('reg_password')
        reg_verify = self.request.get('reg_verify')

        valid = True
        if not valid_usr(reg_user):
            valid = False
            self.write('user')
            return
        if not valid_mail(reg_email):
            valid = False
            self.write('mail')
            return

        if User.by_email(reg_email):
            valid = False
            self.write('mail')
            return

        if User.by_name(reg_user):
            valid = False
            self.write('user')
            return

        if not valid_pass(reg_password):
            valid = False

        if reg_password != reg_verify:
            valid = False

        if valid:
            t = User.register(reg_user, reg_password, reg_email)
            t.put()
            self.login(t)
            self.redirect('/')

我对使查询保持强一致性的理解是,在复制我的数据库的每台计算机都更新之前,该查询不会执行。

如何实现强一致的查询,其中两个用户使用相同的用户名同时注册,其中一个用户将无法这样做。

最佳答案

您需要运行检查查询并将其放入事务中。使用 NDB 执行此操作的文档是 here .

关于python - 与 GAE 数据库进行强一致性查询以进行注册验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13896506/

相关文章:

python - 使用 eval 进行表达式评估的安全性如何?

java.lang.NoClassDefFoundError : com/google/api/client/json/JsonFactory

javascript - GAE channel Api 与套接字

Azure 备份 - 文件系统一致性、应用程序一致性和崩溃一致性

database - CAP 定理 - 可用性和分区容错性

C++ 确保浮点大小为 4 个字节

python - 如何在 python 中查找 csv 文档中的特定行

python 扭曲 : separate protocol from processing

python - 如何在 python-telegram-api 的 ConversationHandler 中管理当前状态

google-app-engine - 在 GAELYK 中,我如何将表单提交的参数变量存储为实体/数据存储中的文本类型