SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Paul 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 SpockBohdan Danyliuk
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2Paul Klimov
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософияPaul Klimov
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflowit-people
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7Technopark
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 

Was ist angesagt? (20)

Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Что нового в 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
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
 
Django
DjangoDjango
Django
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Yii development
Yii developmentYii development
Yii development
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflow
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 

Andere mochten auch

02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOSRoman Brovko
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка XcodeRoman Brovko
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требованияRoman Brovko
 
16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAXRoman 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
Практический анализ и визуальное моделирование на UMLNikolai Kireev
 

Andere mochten auch (12)

02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOS
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка Xcode
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требования
 
16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
 
15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм
 
02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UML
 

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

kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
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 FrameworkGeorgy Turevich
 
Разработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruРазработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruJetStyle
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoIlya Shalyapin
 
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...it-people
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4smikler
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиціShtrih Sruleg
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11dva
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoMoscowDjango
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii 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.agencyit-people
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1dima_kuzovlev
 

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

Введение в Django
Введение в DjangoВведение в Django
Введение в Django
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
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
 
Разработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruРазработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconru
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
 
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиці
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Python Meetup
Python Meetup Python Meetup
Python Meetup
 
ненавязчивый Java Script алексей сергеев
ненавязчивый Java Script   алексей сергеевненавязчивый Java Script   алексей сергеев
ненавязчивый Java Script алексей сергеев
 
Wordpress theme
Wordpress themeWordpress theme
Wordpress theme
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
 

Mehr von 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
 

Mehr von 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
 

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