Джанго 1.2 сессия потеря - PullRequest
       4

Джанго 1.2 сессия потеря

5 голосов
/ 25 апреля 2011

Я задавал подобный вопрос раньше, но я провел еще несколько исследований, и эта итерация должна быть немного другой.Похоже, что у нескольких пользователей SO возникла проблема с регистрацией и входом пользователей в систему в одном представлении, и на самом деле на нее не было ответа.

Проблема в том, что я регистрирую, аутентифицирую и регистрирую пользователя в одном представлении Django.Для большинства пользователей это нормально, но для других пользователей их последующий запрос (они нажимают на ссылку на моем сайте) возвращает анонимного пользователя.Почему-то вошедший в систему пользователь теряет свой сеанс и перенаправляется на страницу моего сайта, где не требуется проверка подлинности.

Когда они затем регистрируются в режиме чистого входа в систему (в отличие от просмотра регистра + входа в систему), данные сеанса остаются в такте.Кажется, проблема действительно заключается в регистрации и регистрации в одном представлении.

См. Этот пост по той же проблеме: https://stackoverflow.com/questions/1693726/problem-with-combined-authentication-login-view.

Было высказано предположение, что это может быть проблема с многопоточностью.Я также видел, что это предполагает, что это относится к серверной части для кэширования данных сеанса.

Есть мысли о том, с чем это связано?Я не могу воспроизвести ошибку, которая действительно сдерживает меня.

РЕДАКТИРОВАТЬ - я должен отметить, что я использую сеансы, поддерживаемые базой данных по умолчанию.

Вот мой регистр / логин

def splash_register(request):
  if request.session.get('beta'):

    if request.method=='POST':
        userform=MyUserCreationForm(request.POST)
        if userform.is_valid():
            #username of <30 char is required by Django User model.  I'm storing username as a hash of user email 

            user=userform.save(commit=False)
            user.username=hash(user.email)
            user.save()



            username=user.username
            password=str(userform.cleaned_data['password'])
            user=auth.authenticate(username=username, password=password)
            if user is not None:
                auth.login(request,user)
                request.session['first_visit']=True
                return HttpResponseRedirect("/")
            else:
                return HttpResponseRedirect('/splash/register/')
        else:
            userform=MyUserCreationForm(request.POST)
            return render_to_response("website/splash_register.html", {'userform':userform}, context_instance=RequestContext(request))
    return render_to_response("website/splash_register.html", context_instance=RequestContext(request))     
else:
    return HttpResponseRedirect('/splash/')        

Ответы [ 3 ]

18 голосов
/ 30 апреля 2011

Вам не нужно использовать аутентификацию, и в этом случае она на самом деле не нужна. Все, что вам нужно сделать, это установить бэкэнд пользовательской записи.

Так что-то вроде этого будет работать:

def splash_register(request):
  if request.session.get('beta'):

    if request.method=='POST':
        userform=MyUserCreationForm(request.POST)
        if userform.is_valid():
            #username of <30 char is required by Django User model.  I'm storing username as a hash of user email 

            user=userform.save(commit=False)
            user.username=hash(user.email)
            user.backend='django.contrib.auth.backends.ModelBackend'
            user.save()


            username=user.username
            password=str(userform.cleaned_data['password'])
            auth.login(request, user)
            request.session['first_visit']=True
            return HttpResponseRedirect("/")
        else:
            userform=MyUserCreationForm(request.POST)
            return render_to_response("website/splash_register.html", {'userform':userform}, context_instance=RequestContext(request))
    return render_to_response("website/splash_register.html", context_instance=RequestContext(request))     
else:
    return HttpResponseRedirect('/splash/')

Обновление

Я упоминал об этом в комментарии, но с точки зрения «ответа» решение состоит в том, чтобы добавить это в файл настроек:

SESSION_COOKIE_DOMAIN = 'yourdomain.com'

Это позволит пользователям заходить с www.yourdomain.com или yourdomain.com для входа на сайт.

3 голосов
/ 01 мая 2011

О, чувак, я невероятно облегчен и полон ненависти к себе. Я понятия не имел, что файлы cookie не могут передаваться между доменными именами www и не www.

Множество моих пользователей приходили на www, а затем были перенаправлены на не-www, убивая их сеанс. Я настраиваю mod_rewrite сейчас, чтобы разрешить ситуацию.

1 голос
/ 20 июля 2011

Просто это помогает кому-то еще, у меня была проблема, когда в текущем представлении request.user.is_authenticated () имеет значение True, но после HttpResponseRedirect на другую страницу, тот же хост, request.user стал анонимным. Я использую сессии, но оказывается, что это была не сессия. Я сделал свой собственный пользовательский бэкэнд аутентификации, и в документах 1.2 сказано, что вы должны реализовать get_user (self, user_id), но я не думал, что user_id (первичный ключ) был чем-то особенным, поэтому я реализовал его как get_user (self, username) .. но по-видимому, это было источником проблемы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...