2011-08-31 3 views
1

Я пишу приложение django, которое, как beckend, использует mongodb. Я вкратце записываю регистрационную часть. Вот как я Connecto к базе данных в settings.pyПроблема с уникальным значением pymongo и django

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 

Таким образом, пользователь был зарегистрирован с тем же именем пользователя и адресом электронной почты, который не может произойти. Любые предложения? Заранее спасибо

ответ

-1

Почему вы не используете https://github.com/django-mongodb-engine/mongodb-engine, он отлично работает с Django ORM. Работает как прелесть для меня.

+0

Я не хочу и нуждаюсь в ORM. Работа с pymongo напрямую подходит для меня, и я не строю огромный веб-сайт просто простого проекта hobbist. – John

Смежные вопросы