Найти - Пользователи
Полная версия: CSRF verification failed. Request aborted. Попытка работы с элементарными формами.
Начало » Django » CSRF verification failed. Request aborted. Попытка работы с элементарными формами.
1 2
SorrowFuck
FishHook
SorrowFuck
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/reg/")
    else:
        form = UserCreationForm()
        return render_to_response("registration.html", {
            'form': form,
        })
Мне дико интересно, а что вернет вьюха, если форма не свалидируется?

Возвращается следующее:
Forbidden (403)
CSRF verification failed. Request aborted.
Reason given for failure:
    CSRF token missing or incorrect.
FishHook
SorrowFuck
Возвращается следующее:
Может быть я плохо вкурил Ваш код, но попробую размышлять логически и последовательно

1. def register(request):
Тут все понятно, вызвана функция в нее переданы параметры
2. if request.method == ‘POST’:
Ага, тут тоже понятно, проверяем что произошло, либо юзер просто загрузил страничку по адресу (GET) либо нажал сабмит формы (POST)
3. if form.is_valid():
Великолепно, проверяем валидность данных и в случае, если форма свалидировалась записываем данные в базу и возвращаем клиенту новый адрес.
4. Пришли не корректные данные
Поток выполнения Вашей программы дошел до места if request.method == ‘POST’, условие выполнилось, проверяем form.is_valid() - условие не выполнилось, дальше этого условия в ифе “верхнего уровня” у Вас ничего нет, значит мы выходим из if request.method == ‘POST’, видим else, которая не отработает, потому что отработал иф, а дальше пустота, что вернет функция? Правильно None. А должна вернуть Response.

SorrowFuck
FishHook
SorrowFuck
Возвращается следующее:
Может быть я плохо вкурил Ваш код, но попробую размышлять логически и последовательно

1. def register(request):
Тут все понятно, вызвана функция в нее переданы параметры
2. if request.method == ‘POST’:
Ага, тут тоже понятно, проверяем что произошло, либо юзер просто загрузил страничку по адресу (GET) либо нажал сабмит формы (POST)
3. if form.is_valid():
Великолепно, проверяем валидность данных и в случае, если форма свалидировалась записываем данные в базу и возвращаем клиенту новый адрес.
4. Пришли не корректные данные
Поток выполнения Вашей программы дошел до места if request.method == ‘POST’, условие выполнилось, проверяем form.is_valid() - условие не выполнилось, дальше этого условия в ифе “верхнего уровня” у Вас ничего нет, значит мы выходим из if request.method == ‘POST’, видим else, которая не отработает, потому что отработал иф, а дальше пустота, что вернет функция? Правильно None. А должна вернуть Response.


Я понял о чем вы говорите и для интереса добавил else и redirect, выглядит это вот так:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/reg/")
        else:
            return HttpResponseRedirect("/")
    else:
        form = UserCreationForm()
        return render_to_response("registration.html", {
            'form': form,

Теперь вот оказывается, что форма не валидна как бы я ее не заполнял, все время срабатывает редирект на “/”.
FishHook
Вместо
else:
            return HttpResponseRedirect("/")
Сделай
 else:
        return render_to_response("registration.html", {
            'form': form})

Увидишь с какими ошибками у тебя не валидируется форма
SorrowFuck
FishHook
Вместо
else:
            return HttpResponseRedirect("/")
Сделай
 else:
        return render_to_response("registration.html", {
            'form': form})

Увидишь с какими ошибками у тебя не валидируется форма

Переписал до такого вида:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.template import RequestContext
def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return render_to_response("done.html")
        else:
            return render_to_response("registration.html", {
            'form': form}, context_instance=RequestContext(request))
    else:
        form = UserCreationForm()
        return render_to_response("registration.html", {
            'form': form,
        }, context_instance=RequestContext(request))

Все работает.
FishHook
SorrowFuck
Все работает.
ну и слава богу
GaiveR
Из djangobook:
After the e-mail is sent, we redirect to a
“success” page by returning an
HttpResponseRedirect object. We’ll leave
the implementation of that “success” page
up to you (it’s a simple view/URLconf/
template), but we should explain why we
initiate a redirect instead of, for example,
simply calling render_to_response()
with a template right there.

The reason: if a user hits “Refresh” on a
page that was loaded via POST , that
request will be repeated. This can often
lead to undesired behavior, such as a
duplicate record being added to the
database – or, in our example, the e-mail
being sent twice. If the user is redirected to
another page after the POST, then there’s
no chance of repeating the request.

You should always issue a redirect for
successful POST requests. It’s a Web
development best practice.
Не критично конечно, но после успешного POST запроса желательно редиректить пользователя, а не просто вызывать render_to_response()
SorrowFuck
GaiveR
Из djangobook:
After the e-mail is sent, we redirect to a
“success” page by returning an
HttpResponseRedirect object. We’ll leave
the implementation of that “success” page
up to you (it’s a simple view/URLconf/
template), but we should explain why we
initiate a redirect instead of, for example,
simply calling render_to_response()
with a template right there.

The reason: if a user hits “Refresh” on a
page that was loaded via POST , that
request will be repeated. This can often
lead to undesired behavior, such as a
duplicate record being added to the
database – or, in our example, the e-mail
being sent twice. If the user is redirected to
another page after the POST, then there’s
no chance of repeating the request.

You should always issue a redirect for
successful POST requests. It’s a Web
development best practice.
Не критично конечно, но после успешного POST запроса желательно редиректить пользователя, а не просто вызывать render_to_response()

Спасибо, учту, не задумывался о повторной записи в базу.
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