Найти - Пользователи
Полная версия: При авторизации вылетает MultiValueDictKeyError на password = request.POST['password']
Начало » Django » При авторизации вылетает MultiValueDictKeyError на password = request.POST['password']
1
Razlagutt
Всем привет! Пожалуйста, помогите с проблемой. Вот код вьюхи:
def get_base_context(prm):
    site_title = SiteTitle.objects.get()
    header_nav = Category.objects.exclude(title='Новости')
    disco = Disco.objects.all()
    disco_name = Disco.objects.filter(category_id=2).first()
    socnet = SocNetButtons.objects.all()
    username = get_user(prm).username
    context = dict(
        site_title=site_title,
        header_nav=header_nav,
        disco=disco,
        disco_name=disco_name,
        socnet=socnet,
        username=username
    )
    return context
def user_login(request):
    context = get_base_context(request)
    context.update(csrf(request))
    if request.POST:
        username = request.POST['username']
        password = request.POST['password']
        print(username)
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('/')
            else:
Из-за чего вылетает:
Environment:
Request Method: POST
Request URL: http://localhost:8000/login/
Django Version: 1.8
Python Version: 3.4.0
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'cannibal_corpse',
 'embed_video',
 'sorl.thumbnail')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')
Traceback:
File "/home/andrey/django/venv/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/andrey/django/mydjangoproject/cannibal_corpse/views.py" in user_login
  90.         password = request.POST['password']
File "/home/andrey/django/venv/lib/python3.4/site-packages/django/utils/datastructures.py" in __getitem__
  322.             raise MultiValueDictKeyError(repr(key))
Exception Type: MultiValueDictKeyError at /login/
Exception Value: "'password'"
Если написать
password = request.POST.get('password', '')
(аналогично и username), то эта ошибка не вылетает, но user is not None = False, если
password = request.POST['password']
, то выскакивает MultiValueDictKeyError, но в shell'e user is not None = True. Что не нравится, не понимаю?
FishHook
Razlagutt
Exception Value: “'password'”
Очевидно, пароля нет в реквесте.
Сделайте в начале функции
print(request.POST)
Razlagutt
FishHook
Ну судя по скрину так и есть. Он вместо пароля цепляет csrf_token. Но это странно в шаблоне вроде все правильно.
<form action="{% url 'user_login' %}" method="POST" class="form-horizontal" role="form">
    {% csrf_token %}
        <div class="form-group">
            <label for="username" class="col-sm-2 control-label">Логин</label>
            <div class="col-sm-10">
                <input type="text" name="username" class="form-control" id="username" placeholder="Логин">
            </div>
        </div>
        <div class="form-group">
            <label for="password" class="col-sm-2 control-label">Пароль</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" id="password" placeholder="Пароль">
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <div class="checkbox">
                    <label>
                        <input type="checkbox"> Запомнить меня
                    </label>
                </div>
            </div>
        </div>
    {% if login_error %}
        <div class="form-group">
            <label class="error col-md-12">{{ login_error }}</label>
        </div>
    {% endif %}
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10 group-inline">
                <button type="submit" class="btn btn-default">Войти</button>
                <a href="#">Зарегистрироваться</a>
                <!--button  type="submit" class="btn btn-default">Зарегистрироваться</button-->
            </div>
        </div>
    </form>
Блин! Что за дурь?
FishHook
У каждого элемента input должен быть атрибут name, у вашего пароля его нет, поэтому в ПОСТ он не передаётся.
Razlagutt
FishHook
У каждого элемента input должен быть атрибут name, у вашего пароля его нет, поэтому в ПОСТ он не передаётся.
Капеееееееееееец! Дурь это мои глаза. Спасибо! Хотя проверял бл*******ь!!!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB