pymongo 和 django 唯一值的问题

发布于 2024-12-02 04:22:04 字数 4058 浏览 1 评论 0原文

我正在编写 django 应用程序,作为后端使用 mongodb。我目前正在写寄存器部分。这是我在 settings.py 中连接到数据库的方法

if socket.gethostname() == "Production server":
    CON = Connection()
    DB = CON.fish
else:
    CON = Connection()
    DB = CON.test
DB.user.ensure_index([("username", ASCENDING),("email",ASCENDING)],unique = True)#,drop_dups=True

这是我的注册视图:

def register(request):
    """
    handle user registration
    code variable is for testing purposes
    """
    if request.method== 'GET':
        form = RegisterForm(auto_id=False)
        code = 1
        return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))
    elif request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            password = form.cleaned_data['password']
            password_confirmation = form.cleaned_data['password_confirmation']
            if password == password_confirmation:
                login = form.cleaned_data['login']
                email = form.cleaned_data['email']
                newsletter = form.cleaned_data['newsletter']
                key = register_user(login,email,password,newsletter)
                if key:

                    #send email
                    send_mail("Dziękujemy za rejestrację"," Klucz aktywacyjny to " + key,settings.EMAIL_HOST_USER,[email])
                    request.session['email'] = email
                    return redirect(register_success)
                else:
                    code = 4
                    error = "Login/email taken"
                    return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))
            else:
                code = 3
                error  = "invalid password"
                return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))
        else:
            code = 2
            return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))

这是我用来注册用户的函数:

def register_user(login,email,password,newsletter):
    """
    This function will return activation key for this user if user was added successfully or none otherwise
    """
    key = generate_activation_key()
    user = {
        "username":login,
        "email":email,
        "password":crypt_password(password),
        "date_join": datetime.now(),
        "key": key
    }
    if newsletter:
        user['newsletter'] = True
    try:
        settings.DB.user.insert(user,safe = True)
    except DuplicateKeyError, error:
        logging.debug("error raise during saving user")
        return None
    except OperationFailure, error:
        logging.critical("Cannot save to database")
        logging.critical(error)
    else:
        #we have no errors users is registred
        return key

当我在浏览器中测试它时,它似乎正在工作。但我为它编写了测试,但它不再起作用了。这是测试代码:

def test_valid_credentials(self):
        #now try to register valid user
        data = {'login':'test','password':'zaq12wsx','password_confirmation':'zaq12wsx','terms':True,'newsletter':True,'email':'[email protected]'}
        response = self.c.post(reverse('register'),data)
        #our user should be registred
        self.assertEquals(302, response.status_code,'We dont have benn redirected')
        self.assertEqual(len(mail.outbox), 1,'No activation email was sent')
        #clen email box
        mail.outbox = []
        #now try to add another user with the same data
        response = self.c.post(reverse('register'),data)
        #template should be rendered with error message about used login and email
        self.assertEquals(200, response.status_code)#this fails

这是我得到的错误。

    self.assertEquals(200, response.status_code)
AssertionError: 200 != 302

因此,用户使用相同的用户名和电子邮件注册,这是不应该发生的。有什么建议吗?提前致谢

I am writing django app that as a beckend is using mongodb. I am curently writing register part. Here is how I connecto to database in settings.py

if socket.gethostname() == "Production server":
    CON = Connection()
    DB = CON.fish
else:
    CON = Connection()
    DB = CON.test
DB.user.ensure_index([("username", ASCENDING),("email",ASCENDING)],unique = True)#,drop_dups=True

Here is mye register view:

def register(request):
    """
    handle user registration
    code variable is for testing purposes
    """
    if request.method== 'GET':
        form = RegisterForm(auto_id=False)
        code = 1
        return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))
    elif request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            password = form.cleaned_data['password']
            password_confirmation = form.cleaned_data['password_confirmation']
            if password == password_confirmation:
                login = form.cleaned_data['login']
                email = form.cleaned_data['email']
                newsletter = form.cleaned_data['newsletter']
                key = register_user(login,email,password,newsletter)
                if key:

                    #send email
                    send_mail("Dziękujemy za rejestrację"," Klucz aktywacyjny to " + key,settings.EMAIL_HOST_USER,[email])
                    request.session['email'] = email
                    return redirect(register_success)
                else:
                    code = 4
                    error = "Login/email taken"
                    return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))
            else:
                code = 3
                error  = "invalid password"
                return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))
        else:
            code = 2
            return render_to_response('register_home.html',locals(),context_instance=RequestContext(request))

Here is my function I use to register user:

def register_user(login,email,password,newsletter):
    """
    This function will return activation key for this user if user was added successfully or none otherwise
    """
    key = generate_activation_key()
    user = {
        "username":login,
        "email":email,
        "password":crypt_password(password),
        "date_join": datetime.now(),
        "key": key
    }
    if newsletter:
        user['newsletter'] = True
    try:
        settings.DB.user.insert(user,safe = True)
    except DuplicateKeyError, error:
        logging.debug("error raise during saving user")
        return None
    except OperationFailure, error:
        logging.critical("Cannot save to database")
        logging.critical(error)
    else:
        #we have no errors users is registred
        return key

And when I test it in the browser it seems to be working. But I write test for it and it isn't working anymore. Here is code for test:

def test_valid_credentials(self):
        #now try to register valid user
        data = {'login':'test','password':'zaq12wsx','password_confirmation':'zaq12wsx','terms':True,'newsletter':True,'email':'[email protected]'}
        response = self.c.post(reverse('register'),data)
        #our user should be registred
        self.assertEquals(302, response.status_code,'We dont have benn redirected')
        self.assertEqual(len(mail.outbox), 1,'No activation email was sent')
        #clen email box
        mail.outbox = []
        #now try to add another user with the same data
        response = self.c.post(reverse('register'),data)
        #template should be rendered with error message about used login and email
        self.assertEquals(200, response.status_code)#this fails

And here is error that i get.

    self.assertEquals(200, response.status_code)
AssertionError: 200 != 302

So user was registred with the same username and email which shoudn't happen. Any sugestions? Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缱倦旧时光 2024-12-09 04:22:04

为什么不使用 https://github.com/django-mongodb-engine/mongodb -engine 它与 Django ORM 几乎完美配合。对我来说就像一个魅力。

Why don't you use https://github.com/django-mongodb-engine/mongodb-engine it works almost perfect with Django ORM. Works like a charm for me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文