Приложение для входа в Django возвращает ошибку 403 запрещено, проблемы с CSRF

Я использую это руководство чтобы попробовать создать приложение для входа в django (супер простой материал ...)

Это код, который я получил в своем шаблоне (index.html)

<div id="login-box">
            {{ state }}
            <form class="login-widgets" action="/login/" method="post">
                {% if next %}
                <input class="login-widgets-text" type="hidden" name="next" value="{{ next }}" />
                {% endif %}
                Username :
                <input class="login-widgets-text" type="text" name="username" value="{{ username}}" /><br />
                Password :
                <input type="password" name="password" value="" /><br />
                <input class="login-button" type="submit" value="Log In" />
            </form>
            <!--<div class="login-widgets">
                <p>Username : ___________</p>
                <p>Password : ___________</p>
            </div>-->
      </div>

И это то, что мне сказали в руководстве добавить на страницу views.py моего приложения:

def login_user(request):
    state = "Please log in below..."
    username = password = ''
    if request.POST:
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                state = "You're successfully logged in!"
            else:
                state = "Your account is not active, please contact the site admin."
        else:
            state = "Your username and/or password were incorrect."

    return render_to_response('index.html',{'state':state, 'username': username})

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

Forbidden (403)
CSRF verification failed. Request aborted.

Я не понимаю, что это значит под проверкой CSRF - в моем settings.py я установил MIDDLEWARE_CLASSES со следующим:

MIDDLEWARE_CLASSES = ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.aut.middleware.AuthenticationMiddleware.A contrib.messages.middleware.MessageMiddleware ', # Раскомментируйте следующую строку для простой защиты от кликджекинга: #' django.middleware.clickjacking.XFrameOptionsMiddleware ',)

Но я не уверен, как проверить CSRF и аутентифицировать логин. Насколько мне известно, суперпользователь базы данных и приведенный выше код выглядят правильно, за исключением того, что я не знаю, как добавить проверку CSRF. Спасибо большое за вашу помощь!


person gersande    schedule 23.07.2013    source источник


Ответы (1)


Добавьте {% csrf_token %} внутри вашей формы. Он будет заменен скрытым вводом с ключом.

Пошаговая документация.

Концепция объяснение.

person Adrián    schedule 23.07.2013
comment
Где-нибудь в форме? - person gersande; 24.07.2013
comment
Это дало мне следующую ошибку: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/template/defaulttags.py:58: UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext. warnings.warn("A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext.") - person gersande; 24.07.2013
comment
@gersande Обычно пишется сразу после открытия: <form ... >{% csrf_token %}. - person Adrián; 24.07.2013
comment
Ошибка исчезла, когда я поместил токен csrf сразу после открытия формы. К сожалению, браузер все еще выдает ошибку: Forbidden (403) CSRF verification failed. Request aborted. - person gersande; 24.07.2013
comment
Выполните эти шаги. - person Adrián; 24.07.2013
comment
Вероятно, вам не хватает одного из промежуточных программ или процессоров контекста. - person Adrián; 24.07.2013
comment
Также убедитесь, что у вас есть SECRET_KEY в settings.py. Он генерируется django, когда вы делаете django-admin.py startapp Возможно, вы удалили его по ошибке. - person Adrián; 24.07.2013
comment
У меня все еще есть мой SECRET_KEY, и, насколько я знаю, я был очень осторожен, чтобы использовать все правильные промежуточные программы ... - person gersande; 24.07.2013
comment
а процессоры контекста шаблона? Вам понадобится django.core.context_processors.csrf, иначе вам придется вручную включать csrf в каждое из ваших представлений. - person Adrián; 24.07.2013
comment
Хорошо, когда я добавил этот фрагмент кода в начало settings.py, приложение отказывается компилироваться и выдает мне эту ошибку в терминале: ImproperlyConfigured: The SECRET_KEY setting must not be empty. - person gersande; 24.07.2013
comment
На самом деле это не решило мою проблему, но я собираюсь отказаться от этого руководства и начать с нуля на основе документов, которые вы мне предоставили. Большое спасибо. - person gersande; 24.07.2013