Приложението за влизане в 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.auth.middleware.AuthenticationMiddleware', 'django. 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