SlideShare a Scribd company logo
Django Views
Django Views
Контроллеры в Django - это обычные функции, которые:
•   принимают объект django.http.HttpRequest
первым параметром
•   возвращают объект django.http.HttpResponse
2
Django Views
# /blog/post_text/?id=123
def post_text(request):
try:
id = request.GET.get('id')
obj = Post.objects.get(pk=id)
except Post.DoesNotExist:
raise Http404
return HttpResponse(obj.text,
content_type='text/plain')
3
Захват параметров из URL
# blog/urls.py
url(r'^category/(d+)/$', 'category_view')
url(r'^(?P<pk>d+)/$', 'post_detail')
4
Захват параметров из URL (2)
# blog/views.py
def category_view(request, pk=None):
# вывести все посты
def post_details(request, pk):
# вывести страницу поста
def category_view(request, *args, **kwargs):
pk = args[0]
pk = kwargs['pk']
5
HttpRequest и
HttpResponse
HttpRequest
•   request.method - метод запроса
•   request.GET - словарь с GET параметрами
•   request.POST - словарь с POST параметрами
•   request.COOKIES - словарь c Cookie
•   request.FILES - загруженныe файлы
•   request.META - CGI-like переменные
•   request.session - словарь-сессия (*)
•   request.user - текущий пользователь (*)
7
HttpResponse
from django.http import HttpResponse
# создание ответа
response = HttpResponse("<html>Hello world</html>")
# установка заголовков
response['Age'] = 120
# установка всех параметров
response = HttpResponse(
content = '<html><h1>Ничего</h1></html>',
content_type = 'text/html',
status = 404,
)
8
Специальные типы ответов
from django.http import HttpResponseRedirect, 
HttpResponseNotFound, HttpResponseForbidden, 
HttpResponsePermanentRedirect
redirect = HttpResponseRedirect("/") # 302
redirect = HttpResponsePermanentRedirect("/") # 301
response = HttpResponseNotFound() # 404
response = HttpResponseForbidden() # 403
9
Получение GET и POST
параметров
order = request.GET['sort'] # опасно!
if order == 'rating':
queryset = queryset.order_by('rating')
page = request.GET.get('page') or 1
try:
page = int(page)
except ValueError:
return HttpResponseBadRequest()
10
GET и POST - объекты QueryDict
/path/?id=3&id=4&id=5
Получение множественных значений
id = request.GET.get('id') # id is 5
id = request.GET.getlist('id') # id is [3,4,5]
Сериализация
qs = request.GET.urlencode()
# qs is 'id=3&id=4&id=5'
11
Получение и установка HTTP
заголовков
user_agent = request.META.get('HTTP_USER_AGENT')
user_ip = request.META.get('HTTP_X_REAL_IP')
if user_ip in None:
user_ip = request.META.get('REMOTE_ADDR')
response = HttpResponse(my_data,
content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 
'attachment; filename="foo.xls"'
12
Получение и установка Cookie
response = HttpResponse(html)
response.set_cookie('visited', '1')
is_visited = request.COOKIES.get('visited')
13
Декораторы
Декораторы в Python
Декоратор – функция, преобразующая одну функцию в другую.
def double_it(func):
def tmp(*args):
return func(*args) * 2
return tmp
@double_it
def mult(a, b):
return a*b
15
Декораторы в Django
from django.views.decorators.http import require_POST
@require_POST
def like(request):
pass
•   @require_GET – только GET запросы
•   @require_POST – только POST запросы
•   @login_required(login_url='/login/')
•   @csrf_exempt – отключить проверку CSRF
16
Class-based
Views
Шаблонизация
Неправильный подход
def header():
return '<html><head>...</head><body>'
def footer():
return '</body></html>'
def page1(data):
return header() + 
'<h1>' + data['title'] + '</h1>' + 
'<p>' + data['text'] + '</p>' + 
footer()
19
Правильный подход
Необходимо отделить данные (контекст) от представления
(шаблона). Для этого используются шаблонизаторы.
➕ Разделение работы web-мастера и программиста
➕ Повторное использование HTML кода
➕ Более чистый python код
20
Синтаксис шаблонов
<!-- templates/blog/post_details.html -->
<html>
<head>...</head>
<body>
<h1>{{ post.title|truncatechars:80 }}</h1>
<p>{{ post.text }}></p>
{% for comment in comments %}
{% include "blog/comment.html" %}
{% endfor %}
</body>
</html>
21
Вызов шаблонизатора
# project/blog/views.py
from django.shortcuts import render, render_to_response
return render_to_response('blog/post_details.html', {
'post': post,
'comments': comments,
})
return render(request, 'blog/post_details.html', {
'post': post,
'comments': comments,
})
22
Возможности шаблонизатора
•   {% for item in list %}{% endfor %} - итерация по списку
•   {% if var %}{% endif %} - условное отображение
•   {% include "tpl.html" %} - включение подшаблона
•   {{ var }} - вывод переменной
•   {{ var|truncatechars:9 }} - применение фильтров
•   {# comment #} , {% comment %}{% endcomment %} -
комментарии
23
Доступ к свойствам и методам
Через точку можно получить свойство, метод, ключ либо индекс
объекта:
{{ object.content }}
{{ name.strip }}
{{ info.avatar }}
{{ post_list.0 }}
Передавать параметры методам запрещено:
{{ post_list.order_by('id') }} <!-- ошибка -->
{{ post_list.delete }}
24
Особенности шаблонизатора
•   Шаблоны автоматически экранируют HTML сущности
•   Шаблонизатор можно расширять своими фильтрами и тэгами
25
Наследование
шаблонов
27
Базовый шаблон base.html
<!DOCTYPE HTML>
<html>
<head>
<title>{% block title %}Q&A{% endblock %}</title>
{% block extrahead %}{% endblock %}
</head>
<body>
<h1>Вопросы и ответы</h1>
{% block content %}{% endblock %}
</body>
</html>
28
Шаблон главной страницы
{% extends "base.html" %}
{% block title %}
{{ block.super }} – главная
{% endblock %}
{% block content %}
{% for obj in post_list %}
<div class="question">
<a href="{{ obj.build_url }}">{{ obj }}</a>
{{ obj.created_date|date:"d.m.Y" }}
</div>
{% endfor %}
{% endblock %}
29
Context
processors
Context processors
Context processors - это функции, которые вызываются перед
отрисовкой шаблона и могут добавить данных в контекст.
Настройка TEMPLATE_CONTEXT_PROCESSORS :
•   django.core.context_processors.request (request)
•   django.core.context_processors.csrf (csrf_token)
•   django.core.context_processors.static (STATIC_URL)
•   django.contrib.auth.context_processors.auth (user, perms)
31
Когда не вызываются context
processors ?
render(request, template_name, context) - вызывает.
render_to_response(template_name, context) - не вызывает.
32
Ad

More Related Content

What's hot (20)

Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
Technopark
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
Paul Klimov
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
Paul Klimov
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
Что нового в Django 1.4
Что нового в Django 1.4Что нового в Django 1.4
Что нового в Django 1.4
Илья Барышев
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
Bohdan Danyliuk
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
Paul Stashevsky
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
Paul Klimov
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
Anatoly Sharifulin
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
Paul Klimov
 
Django
DjangoDjango
Django
Sergey Maslennikov
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
Magento Dev
 
Yii development
Yii developmentYii development
Yii development
MageCloud
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflow
it-people
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
Technopark
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
Technopark
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
Paul Klimov
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
Paul Klimov
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
Bohdan Danyliuk
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
Paul Stashevsky
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
Paul Klimov
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
Paul Klimov
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
Magento Dev
 
Yii development
Yii developmentYii development
Yii development
MageCloud
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflow
it-people
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
Technopark
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov
 

Viewers also liked (12)

02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOS
Roman Brovko
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка Xcode
Roman Brovko
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требования
Roman Brovko
 
16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX
Roman Brovko
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
Roman Brovko
 
15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация
Roman Brovko
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм
Roman Brovko
 
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
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
Roman Brovko
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
Roman Brovko
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UML
Nikolai Kireev
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOS
Roman Brovko
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка Xcode
Roman Brovko
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требования
Roman Brovko
 
16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX
Roman Brovko
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
Roman Brovko
 
15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация
Roman Brovko
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм
Roman Brovko
 
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
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
Roman Brovko
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
Roman Brovko
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UML
Nikolai Kireev
 
Ad

Similar to 10 - Web-технологии. MVC фреймворки (продолжение) (20)

Введение в Django
Введение в DjangoВведение в Django
Введение в Django
Илья Барышев
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
Georgy Turevich
 
Разработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruРазработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconru
JetStyle
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Ilya Shalyapin
 
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
it-people
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
smikler
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиці
Shtrih Sruleg
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
dva
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
MoscowDjango
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
Technopark
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
Oleksii Okhrymenko
 
Python Meetup
Python Meetup Python Meetup
Python Meetup
iQSpace
 
ненавязчивый Java Script алексей сергеев
ненавязчивый Java Script   алексей сергеевненавязчивый Java Script   алексей сергеев
ненавязчивый Java Script алексей сергеев
Media Gorod
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
dima_kuzovlev
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
Georgy Turevich
 
Разработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruРазработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconru
JetStyle
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Ilya Shalyapin
 
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
it-people
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
smikler
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиці
Shtrih Sruleg
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
dva
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
MoscowDjango
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
Technopark
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
Oleksii Okhrymenko
 
Python Meetup
Python Meetup Python Meetup
Python Meetup
iQSpace
 
ненавязчивый Java Script алексей сергеев
ненавязчивый Java Script   алексей сергеевненавязчивый Java Script   алексей сергеев
ненавязчивый Java Script алексей сергеев
Media Gorod
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
dima_kuzovlev
 
Ad

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
Roman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
Roman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
Roman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman 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_sensor
Roman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
Roman 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_buttons
Roman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
Roman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
Roman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
Roman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
Roman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
Roman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
Roman Brovko
 
Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
Roman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
Roman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
Roman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman 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_sensor
Roman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
Roman 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_buttons
Roman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
Roman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
Roman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
Roman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
Roman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
Roman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
Roman Brovko
 

10 - Web-технологии. MVC фреймворки (продолжение)

  • 2. Django Views Контроллеры в Django - это обычные функции, которые: •   принимают объект django.http.HttpRequest первым параметром •   возвращают объект django.http.HttpResponse 2
  • 3. Django Views # /blog/post_text/?id=123 def post_text(request): try: id = request.GET.get('id') obj = Post.objects.get(pk=id) except Post.DoesNotExist: raise Http404 return HttpResponse(obj.text, content_type='text/plain') 3
  • 4. Захват параметров из URL # blog/urls.py url(r'^category/(d+)/$', 'category_view') url(r'^(?P<pk>d+)/$', 'post_detail') 4
  • 5. Захват параметров из URL (2) # blog/views.py def category_view(request, pk=None): # вывести все посты def post_details(request, pk): # вывести страницу поста def category_view(request, *args, **kwargs): pk = args[0] pk = kwargs['pk'] 5
  • 7. HttpRequest •   request.method - метод запроса •   request.GET - словарь с GET параметрами •   request.POST - словарь с POST параметрами •   request.COOKIES - словарь c Cookie •   request.FILES - загруженныe файлы •   request.META - CGI-like переменные •   request.session - словарь-сессия (*) •   request.user - текущий пользователь (*) 7
  • 8. HttpResponse from django.http import HttpResponse # создание ответа response = HttpResponse("<html>Hello world</html>") # установка заголовков response['Age'] = 120 # установка всех параметров response = HttpResponse( content = '<html><h1>Ничего</h1></html>', content_type = 'text/html', status = 404, ) 8
  • 9. Специальные типы ответов from django.http import HttpResponseRedirect, HttpResponseNotFound, HttpResponseForbidden, HttpResponsePermanentRedirect redirect = HttpResponseRedirect("/") # 302 redirect = HttpResponsePermanentRedirect("/") # 301 response = HttpResponseNotFound() # 404 response = HttpResponseForbidden() # 403 9
  • 10. Получение GET и POST параметров order = request.GET['sort'] # опасно! if order == 'rating': queryset = queryset.order_by('rating') page = request.GET.get('page') or 1 try: page = int(page) except ValueError: return HttpResponseBadRequest() 10
  • 11. GET и POST - объекты QueryDict /path/?id=3&id=4&id=5 Получение множественных значений id = request.GET.get('id') # id is 5 id = request.GET.getlist('id') # id is [3,4,5] Сериализация qs = request.GET.urlencode() # qs is 'id=3&id=4&id=5' 11
  • 12. Получение и установка HTTP заголовков user_agent = request.META.get('HTTP_USER_AGENT') user_ip = request.META.get('HTTP_X_REAL_IP') if user_ip in None: user_ip = request.META.get('REMOTE_ADDR') response = HttpResponse(my_data, content_type='application/vnd.ms-excel') response['Content-Disposition'] = 'attachment; filename="foo.xls"' 12
  • 13. Получение и установка Cookie response = HttpResponse(html) response.set_cookie('visited', '1') is_visited = request.COOKIES.get('visited') 13
  • 15. Декораторы в Python Декоратор – функция, преобразующая одну функцию в другую. def double_it(func): def tmp(*args): return func(*args) * 2 return tmp @double_it def mult(a, b): return a*b 15
  • 16. Декораторы в Django from django.views.decorators.http import require_POST @require_POST def like(request): pass •   @require_GET – только GET запросы •   @require_POST – только POST запросы •   @login_required(login_url='/login/') •   @csrf_exempt – отключить проверку CSRF 16
  • 19. Неправильный подход def header(): return '<html><head>...</head><body>' def footer(): return '</body></html>' def page1(data): return header() + '<h1>' + data['title'] + '</h1>' + '<p>' + data['text'] + '</p>' + footer() 19
  • 20. Правильный подход Необходимо отделить данные (контекст) от представления (шаблона). Для этого используются шаблонизаторы. ➕ Разделение работы web-мастера и программиста ➕ Повторное использование HTML кода ➕ Более чистый python код 20
  • 21. Синтаксис шаблонов <!-- templates/blog/post_details.html --> <html> <head>...</head> <body> <h1>{{ post.title|truncatechars:80 }}</h1> <p>{{ post.text }}></p> {% for comment in comments %} {% include "blog/comment.html" %} {% endfor %} </body> </html> 21
  • 22. Вызов шаблонизатора # project/blog/views.py from django.shortcuts import render, render_to_response return render_to_response('blog/post_details.html', { 'post': post, 'comments': comments, }) return render(request, 'blog/post_details.html', { 'post': post, 'comments': comments, }) 22
  • 23. Возможности шаблонизатора •   {% for item in list %}{% endfor %} - итерация по списку •   {% if var %}{% endif %} - условное отображение •   {% include "tpl.html" %} - включение подшаблона •   {{ var }} - вывод переменной •   {{ var|truncatechars:9 }} - применение фильтров •   {# comment #} , {% comment %}{% endcomment %} - комментарии 23
  • 24. Доступ к свойствам и методам Через точку можно получить свойство, метод, ключ либо индекс объекта: {{ object.content }} {{ name.strip }} {{ info.avatar }} {{ post_list.0 }} Передавать параметры методам запрещено: {{ post_list.order_by('id') }} <!-- ошибка --> {{ post_list.delete }} 24
  • 25. Особенности шаблонизатора •   Шаблоны автоматически экранируют HTML сущности •   Шаблонизатор можно расширять своими фильтрами и тэгами 25
  • 27. 27
  • 28. Базовый шаблон base.html <!DOCTYPE HTML> <html> <head> <title>{% block title %}Q&A{% endblock %}</title> {% block extrahead %}{% endblock %} </head> <body> <h1>Вопросы и ответы</h1> {% block content %}{% endblock %} </body> </html> 28
  • 29. Шаблон главной страницы {% extends "base.html" %} {% block title %} {{ block.super }} – главная {% endblock %} {% block content %} {% for obj in post_list %} <div class="question"> <a href="{{ obj.build_url }}">{{ obj }}</a> {{ obj.created_date|date:"d.m.Y" }} </div> {% endfor %} {% endblock %} 29
  • 31. Context processors Context processors - это функции, которые вызываются перед отрисовкой шаблона и могут добавить данных в контекст. Настройка TEMPLATE_CONTEXT_PROCESSORS : •   django.core.context_processors.request (request) •   django.core.context_processors.csrf (csrf_token) •   django.core.context_processors.static (STATIC_URL) •   django.contrib.auth.context_processors.auth (user, perms) 31
  • 32. Когда не вызываются context processors ? render(request, template_name, context) - вызывает. render_to_response(template_name, context) - не вызывает. 32
  翻译: