SlideShare a Scribd company logo
1 of 22
Download to read offline
Обработка
форм
GET / POST формы
GET - метод для получения данных. GET запросы могут быть
закешированны промежуточными серверами. GET должен
применяться только в поисковых формах.
POST - метод для изменения данных. POST запросы никогда не
кешируются промежуточными серверами. POST должен
применяться в формах, изменяющих данные на сервере.
2
Общий сценарий обработки
3
Best practice
•   Всегда проверять пользовательские данные
•   Для форм, изменяющих данные, использовать метод POST
•   Не заставлять вводить данные повторно
•   Сообщать об ошибках детально - по полям
•   Сообщать об успешном сохранении формы
•   При успешном сохранении делать перенаправление
4
HTTP Redirect
Перенаправления в HTTP
6
Перенаправления в HTTP
•   302 Found - временное перенаправление
•   301 Moved Permanently - постоянное перенаправление
(кешируется в браузере)
•   Location: url - URL для повторного запроса. Может быть как
абсолютным, так и относительным.
7
Перенаправления в Django
from django.http import HttpResponseRedirect
def some_view(request):
# logic..
return HttpResponseRedirect('/new_url/')
# уязвимость open redirect
def dangerous_view(request):
url = request.GET.get('continue')
return HttpResponseRedirect(url)
8
Django forms
Описание форм
from django import forms
class FeedbackForm(forms.Form):
email = forms.EmailField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
def clean(self):
if is_spam(self.clean_data):
raise forms.ValidationError(
u'Сообщение похоже на спам',
code='spam'
)
10
class AddPostForm(forms.Form):
title = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data['message']
if not is_ethic(message):
raise forms.ValidationError(
u'Сообщение не корректно', code=12)
return message + 
"nThank you for your attention."
def save(self):
post = Post(**self.cleaned_data)
post.save()
return post
11
Типы полей
•   BooleanField - флажок
•   CharField - текстовое поле ввода
•   EmailField - текстовое поле, Email
•   ChoiceField - выбор из нескольких вариантов
•   DateField - выбор даты
•   DateTimeField - выбор даты и времени
•   FileField - загрузка файлов
12
Валидация данных
•   По типу поля, например EmailField
•   clean_xxx - доп. проверка поля xxx, может изменить значение
•   clean - доп. проверка всех полей формы
Методы clean и clean_xxx должны использовать
self.cleaned_data для получения данных формы и поднять
ValidationError в случае некорректных данных.
13
Использование во view
def post_add(request):
if request.method == "POST":
form = AddPostForm(request.POST)
if form.is_valid():
post = form.save()
url = post.get_url()
return HttpResponseRedirect(url)
else:
form = AddPostForm()
return render(request, 'blog/post_add.html', {
'form': form
})
14
Использование в шаблонах
{{ form.as_ul }}
{{ form.as_p }}
{{ form.as_table }}
15
{% for e in form.non_field_errors %}
<div class="alert alert-danger">{{ e }}</div>
{% endif %}
<form class="form-horizontal" method="post" action="/blog/add/">
<fieldset>
{% for field in form %}
<div class="control-group
{% if field.errors %}has-error{% endif %}">
<label class="control-label">{{ field.label }}</label>
<div class="controls">{{ field }}</div>
</div>
{% endfor %}
</fieldset>
<div class="form-actions">
<button type="submit" class="btn btn-primary">
Сохранить</button>
</div>
</form>
16
Model forms
from django.forms import ModelForm
class ArticleForm(ModelForm):
class Meta:
model = Post
fields = ['title', 'content',
'category', 'tags']
Метод save уже определен и сохраняет модель Meta.model
17
Безопасность
Проверка пользователя
class AddPostForm(forms.Form):
# ... поля ...
def __init__(self, user, **kwargs):
self._user = user
super(AddPostForm, self).__init__(**kwargs)
def clean(self):
if self._user.is_banned:
raise ValidationError(u'Доступ ограничен')
def save(self):
self.cleaned_data['author'] = self._user
return Post.objects.create(**self.cleaned_data)
19
Проверка пользователя (2)
from django.contrib.auth.decorators 
import login_required
@login_required
def post_add(request):
form = AddPostForm(request.user, request.POST)
if form.is_valid():
post = form.save()
20
Cross Site Resource Forgery
21
Методы борьбы с CSRF
•   Проверка метода @require_POST
•   Проверка заголовка Referer
•   Проверка CSRF-токенов
<form method="POST" action="/blog/add">
{% csrf_token %}
</form>
22

More Related Content

Viewers also liked

02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиентыRoman Brovko
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложенийRoman Brovko
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка XcodeRoman Brovko
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)Roman Brovko
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOSRoman Brovko
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требованияRoman Brovko
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервераRoman Brovko
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентовRoman Brovko
 
04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилей04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилейRoman Brovko
 
03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTML03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTMLRoman Brovko
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLNikolai Kireev
 
08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backendRoman Brovko
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на JavaRoman Brovko
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программRoman Brovko
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSFRoman Brovko
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотекиRoman Brovko
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основыRoman Brovko
 
03-Hibernate. Документация
03-Hibernate. Документация03-Hibernate. Документация
03-Hibernate. ДокументацияRoman Brovko
 
01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPA01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPARoman Brovko
 
04-Hibernate. Создание проекта
04-Hibernate. Создание проекта04-Hibernate. Создание проекта
04-Hibernate. Создание проектаRoman Brovko
 

Viewers also liked (20)

02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка Xcode
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOS
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требования
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
 
04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилей04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилей
 
03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTML03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTML
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UML
 
08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSF
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотеки
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
03-Hibernate. Документация
03-Hibernate. Документация03-Hibernate. Документация
03-Hibernate. Документация
 
01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPA01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPA
 
04-Hibernate. Создание проекта
04-Hibernate. Создание проекта04-Hibernate. Создание проекта
04-Hibernate. Создание проекта
 

Similar to 14 - Web-технологии. Обработка форм

C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxYandex
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый стартAntonio
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajaxYandex
 
шаг открытый урок
шаг  открытый урокшаг  открытый урок
шаг открытый урокVitaly Voskobovich
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.Igor Shkulipa
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 

Similar to 14 - Web-технологии. Обработка форм (9)

REST
RESTREST
REST
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, Ajax
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
 
шаг открытый урок
шаг  открытый урокшаг  открытый урок
шаг открытый урок
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task NetworkingRoman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernetRoman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flashRoman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2CRoman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uartRoman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorRoman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwmRoman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsRoman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_worldRoman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisitesRoman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advancedRoman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advancedRoman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advancedRoman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окруженияRoman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advancedRoman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basicsRoman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

14 - Web-технологии. Обработка форм

  • 2. GET / POST формы GET - метод для получения данных. GET запросы могут быть закешированны промежуточными серверами. GET должен применяться только в поисковых формах. POST - метод для изменения данных. POST запросы никогда не кешируются промежуточными серверами. POST должен применяться в формах, изменяющих данные на сервере. 2
  • 4. Best practice •   Всегда проверять пользовательские данные •   Для форм, изменяющих данные, использовать метод POST •   Не заставлять вводить данные повторно •   Сообщать об ошибках детально - по полям •   Сообщать об успешном сохранении формы •   При успешном сохранении делать перенаправление 4
  • 7. Перенаправления в HTTP •   302 Found - временное перенаправление •   301 Moved Permanently - постоянное перенаправление (кешируется в браузере) •   Location: url - URL для повторного запроса. Может быть как абсолютным, так и относительным. 7
  • 8. Перенаправления в Django from django.http import HttpResponseRedirect def some_view(request): # logic.. return HttpResponseRedirect('/new_url/') # уязвимость open redirect def dangerous_view(request): url = request.GET.get('continue') return HttpResponseRedirect(url) 8
  • 10. Описание форм from django import forms class FeedbackForm(forms.Form): email = forms.EmailField(max_length=100) message = forms.CharField(widget=forms.Textarea) def clean(self): if is_spam(self.clean_data): raise forms.ValidationError( u'Сообщение похоже на спам', code='spam' ) 10
  • 11. class AddPostForm(forms.Form): title = forms.CharField(max_length=100) message = forms.CharField(widget=forms.Textarea) def clean_message(self): message = self.cleaned_data['message'] if not is_ethic(message): raise forms.ValidationError( u'Сообщение не корректно', code=12) return message + "nThank you for your attention." def save(self): post = Post(**self.cleaned_data) post.save() return post 11
  • 12. Типы полей •   BooleanField - флажок •   CharField - текстовое поле ввода •   EmailField - текстовое поле, Email •   ChoiceField - выбор из нескольких вариантов •   DateField - выбор даты •   DateTimeField - выбор даты и времени •   FileField - загрузка файлов 12
  • 13. Валидация данных •   По типу поля, например EmailField •   clean_xxx - доп. проверка поля xxx, может изменить значение •   clean - доп. проверка всех полей формы Методы clean и clean_xxx должны использовать self.cleaned_data для получения данных формы и поднять ValidationError в случае некорректных данных. 13
  • 14. Использование во view def post_add(request): if request.method == "POST": form = AddPostForm(request.POST) if form.is_valid(): post = form.save() url = post.get_url() return HttpResponseRedirect(url) else: form = AddPostForm() return render(request, 'blog/post_add.html', { 'form': form }) 14
  • 15. Использование в шаблонах {{ form.as_ul }} {{ form.as_p }} {{ form.as_table }} 15
  • 16. {% for e in form.non_field_errors %} <div class="alert alert-danger">{{ e }}</div> {% endif %} <form class="form-horizontal" method="post" action="/blog/add/"> <fieldset> {% for field in form %} <div class="control-group {% if field.errors %}has-error{% endif %}"> <label class="control-label">{{ field.label }}</label> <div class="controls">{{ field }}</div> </div> {% endfor %} </fieldset> <div class="form-actions"> <button type="submit" class="btn btn-primary"> Сохранить</button> </div> </form> 16
  • 17. Model forms from django.forms import ModelForm class ArticleForm(ModelForm): class Meta: model = Post fields = ['title', 'content', 'category', 'tags'] Метод save уже определен и сохраняет модель Meta.model 17
  • 19. Проверка пользователя class AddPostForm(forms.Form): # ... поля ... def __init__(self, user, **kwargs): self._user = user super(AddPostForm, self).__init__(**kwargs) def clean(self): if self._user.is_banned: raise ValidationError(u'Доступ ограничен') def save(self): self.cleaned_data['author'] = self._user return Post.objects.create(**self.cleaned_data) 19
  • 20. Проверка пользователя (2) from django.contrib.auth.decorators import login_required @login_required def post_add(request): form = AddPostForm(request.user, request.POST) if form.is_valid(): post = form.save() 20
  • 21. Cross Site Resource Forgery 21
  • 22. Методы борьбы с CSRF •   Проверка метода @require_POST •   Проверка заголовка Referer •   Проверка CSRF-токенов <form method="POST" action="/blog/add"> {% csrf_token %} </form> 22