Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » CSRF verification failed. Request aborted. Попытка работы с элементарными формами. [RSS Feed]

#1 Окт. 11, 2012 03:43:37

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

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.



_________
Новичок

Офлайн

#2 Окт. 11, 2012 05:41:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

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.



Офлайн

#3 Окт. 11, 2012 06:09:26

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

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,

Теперь вот оказывается, что форма не валидна как бы я ее не заполнял, все время срабатывает редирект на “/”.



_________
Новичок

Офлайн

#4 Окт. 11, 2012 07:14:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

Вместо

else:
            return HttpResponseRedirect("/")
Сделай
 else:
        return render_to_response("registration.html", {
            'form': form})

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



Отредактировано FishHook (Окт. 11, 2012 07:15:01)

Офлайн

#5 Окт. 11, 2012 07:49:33

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

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))

Все работает.



_________
Новичок

Отредактировано SorrowFuck (Окт. 11, 2012 07:53:55)

Офлайн

#6 Окт. 11, 2012 08:22:13

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

SorrowFuck
Все работает.
ну и слава богу



Офлайн

#7 Окт. 13, 2012 18:43:43

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

Из 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()



Офлайн

#8 Окт. 14, 2012 17:02:10

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

CSRF verification failed. Request aborted. Попытка работы с элементарными формами.

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()

Спасибо, учту, не задумывался о повторной записи в базу.



_________
Новичок

Офлайн

  • Начало
  • » Django
  • » CSRF verification failed. Request aborted. Попытка работы с элементарными формами.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version