Почему не работает этот вид входа в систему?(Джанго) - PullRequest
0 голосов
/ 17 декабря 2011

Я пытаюсь создать вид входа в систему с кеш-системой Django.Вот мой код:

def login(request):
    if request.method == 'POST':

        form = LoginForm(request.POST)

        if form.is_valid():

            cd = form.cleaned_data
            username_exists = User.objects.filter(username=cd['username1'])
            if username_exists.count() != 0:
                username = username_exists[0]
                if username.password == cd['password']:
                    currentuser = cd['username1']
                    request.session['loggedin'+currentuser] = True
                    return HttpResponseRedirect('/user/%' % currentuser)
                else:
                    form = LoginForm(request.POST)
                    return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
            else:
                form = LoginForm(request.POST)
                return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
        else:
            form = LoginForm(request.POST)
            return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
    else:
        form = LoginForm()
        return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))

Моя модель, которую я использую в базе данных ниже:

class User(models.Model):

    username = models.CharField(max_length=15)
    password = models.CharField(max_length=25)

Вот форма "LoginForm":

class LoginForm(forms.Form):

    username1 = forms.CharField(max_length=15, label="Username")
    password = forms.CharField(max_length=25, widget=forms.PasswordInput, label="Password")

Вот часть шаблона, которую я использую:

<h3>Login</h3>

<form action="" method="post">

{% csrf_token %}

<table>

{{ form.as_table }}

</table>

<input type="submit" value="Submit" style="margin-left:170px;margin-top:50px;">

</form>

Вместо перенаправления на страницу пользователя, представление просто обновляет страницу входа с информацией о заполненной форме (request.POST).

Я новичок в Django, поэтому, пожалуйста, предупредите меня, если я делаю что-то действительно глупое.

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

Проблема в том, что ваше последнее условие успеха включает в себя проверку пароля непосредственно против user.password, который является односторонним хешированным паролем. Таким образом, вы, вероятно, проверяете mypassword против sha1$b322a$7e51a244d45f70d17b0bbca2b7369c1732b09c69

Вместо этого используйте django.contrib.auth.check_password или функцию authenticate, которая сделает сравнение паролей для вас, а также войдет в систему пользователя. Похоже, вы выполняете какой-то ручной вход в систему, где установлен флаг сеанса, отмечающий пользователя как вошли в систему. Все ваши пользователи тоже будут AnoymousUser объектами:)

Читайте о структуре аутентификации ... django.contrib.auth фантастически полезен.

Если вы используете встроенные функции, вы можете использовать более простые сочетания клавиш, такие как request.user.is_authenticated(), чтобы определить статус входа в систему.

В любом случае, проповедуя в стороне, вручную проверять пароль:
https://docs.djangoproject.com/en/1.1/topics/auth/#manually-checking-a-user-s-password

Чтобы действительно войти в систему, используя фреймворк: https://docs.djangoproject.com/en/1.1/topics/auth/#django.contrib.auth.authenticate

Другая проблема с вашим кодом заключается в том, что трудно определить, что не удалось - пользователь / вы не получите полезную информацию о том, как его логин не удался.

Как правило, лучше поместить эту информацию в чистые методы формы, чтобы вы могли поднять ValidationErrors, который автоматически появится в вашей форме, не загромождая несколько блоков if.

1 голос
/ 17 декабря 2011

Вы заново изобретаете колесо.Модель User из contrib.auth уже проверяет дубликаты имен пользователей.

Если вы хотите предоставить собственную форму и представление для создания пользователей, почти весь необходимый вам код уже присутствует в contrib.auth.

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