SlideShare a Scribd company logo
Обработка HTTP
запросов.
Django Views
Александр Бекбулатов
План лекции

1. Конфигурация Django.
2. Маршрутизация URL.
3. Django Views.
4. Использование Django Forms для обработки
входных данных.
5. Генерация HTML страницы с помощью
шаблонизатора.

2
Конфигурация Django

3
Конфигурация Django
DEBUG = False?

• Шаблоны 404.html и 500.html вместо
отладочных
• Ошибки высылаются на почту (ADMINS) либо
LOGGING (http://tp.mail.ru/blog/Web/571.html)
• SuspiciousOperation: Invalid HTTP_HOST header
(ALLOWED_HOSTS)
• Запросы и тайминги хранятся в
django.db.connection
4
Конфигурация Django
Другие важные настройки

• DATABASES
• INSTALLED_APPS
• TEMPLATE_DIRS
• ROOT_URLCONF
• MEDIA_ROOT, MEDIA_URL
• STATIC_ROOT, STATIC_URL

5
Конфигурация Django
Относительные пути
import os.path

def rel(*x):
return os.path.join(
os.path.abspath(os.path.dirname(__file__)),
*x)

TEMPLATE_DIRS = (
rel('../templates'),
)

6
Конфигурация Django
Паттерн local_settings
try:

from ask_pupkin.local_settings import *
except ImportError:
pass

7
Маршрутизация URL

8
Маршрутизация URL
Маршрутизация проекта
urlpatterns = patterns('',
url(r'^$', 'blog.views.home', name='home'),
url(r'^', include(contacts.urls')),
url(r'^admin/', include(admin.site.urls)),
)

Маршрутизация приложения
urlpatterns = patterns('blog.views',
url(r'^$', 'post_list', name='post_list'),
url(r'^category/(d+)/$', 'category’,
name='post_list_by_category'),
url(r'^(?P<pk>d+)/$', ' post_detail',
name='post_detail'),
)
9
Django Views

10
Django Views
Требования к контроллерам

 Должны быть callable объектом
 Должны принимать HttpRequest первым параметром
 Должны возвращать HttpResponse

11
Django Views
def post_list(request):
object_list = Post.objects.all()[:20]
return render(request, 'blog/post_list.html',
{'post_list' : object_list}
)
def post_detail(request, pk):
try:
object = Post.objects.get(pk=pk)
except Post.DoesNotExist:
raise Http404
return render(request, 'blog/post_detail.html',
{'object': object}
)
12
Django Views
def category(request, pk):
cat = get_object_or_404(Category, pk=pk)
post_list = Post.objects.filter(category=cat)
return render(request, 'blog/category.html', {
'category': cat,
'post_list' : post_list
})

13
Захват и передача параметров из
URL во View
Захват параметров
url(r'^category/(d+)/$', 'category’,
name='post_list_by_category')
url(r'^(?P<pk>d+)/$', 'post_detail',
name='post_detail')

Передача во View
def category(request, pk=None):
if pk is None:
# вывести все посты
def category(request, *args, **kwargs):
pk = args[0]
pk = kwargs['pk']
14
HttpRequest
Свойства
• request.method
• request.GET

• request.POST
• request.COOKIES
• request.FILES
• request.META
Методы
• request.get_full_path()
• request.build_absolute_uri()

• request.is_ajax()
15
HttpResponse
def get_time(request):
now = datetime.datetime.now()
return HttpResponse(
"It is now %s" % now,
content_type="text/plain")

Классы с другим кодом возврата

• HttpResponseRedirect
• HttpResponsePermanentRedirect
• HttpResponseNotFound

• HttpResponseForbidden
16
Получение GET и POST параметров
GET
page = request.GET.get('page') or 1
try:
return int(page)
except ValueError:
raise Http404

order = request.GET.get('sort')
if order == 'rating':
queryset = queryset.order_by('rating')

17
Получение GET и POST параметров
POST
message = request.POST.get('message')
sender = request.POST.get('email')
if message and sender:
send_mail('[My Blog]', message, sender,
['me@mail.ru'])

18
Получение и установка HTTP
заголовков
if request.META.get('REMOTE_ADDR', None) in
INTERNAL_IPS:
response.content += debug_output

response = HttpResponse(my_data,
content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment;
filename="foo.xls"'

19
Получение и установка Cookie
Установка
response = render(request, 'blog/index.html')
response.set_cookie('visited', '1')
return response

Получение
if not request.COOKIES.get('visited'):
show_banner = True

20
Использование Django
Forms для обработки
входных данных

21
Django Forms

from django import forms
class ContactForm(forms.Form):
email = forms.EmailField(max_length=100)
message =
forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data.get('message')
if not check_antispam(message):
raise form.ValidationError('Spam
detected!')

22
Django Forms
Свойства полей формы

https://docs.djangoproject.com/en/dev/ref/models/fields/
23
Django Forms API
>>> f = ContactForm()
>>> data = {'email': 'foo@example.com', 'message':
'Hi there'}
>>> f = ContactForm(data)
>>> f.is_valid()
True
>>> f.cleaned_data
{'email': u'foo@example.com', 'message': u'Hi
there'}
>>> f = ContactForm({})
>>> f.is_valid()
False
>>> f.errors
{'email': [u'Enter a valid e-mail address.'],
'message': [u'This field is required.']}
24
Django Forms API
>>> f = ContactForm()
>>> print f.as_table()
<tr><th><label for="id_for_email">Ваш email:</label></th><td><input id="id_for_ email "
type="text" name="email" maxlength="100"
/></td></tr>…
>>> print f.email
><input id="id_for_ email " type="text"
name="email" maxlength="100" />

25
Django Forms
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
message = form.cleaned_data['message']
sender = form.cleaned_data['email']
recipients = send_mail('My Blog',
message, sender, ['me@mail.ru'])
return HttpResponseRedirect('/')
else:
form = ContactForm()
return render(request, 'blog/contact.html', {
'form': form
})
26
Django Forms
Визуализация
 Выводить поля по одному и оборачивать div
 Использовать сторонние приложения

27
Django Forms
Визуализация
{% for field in form %}
<fieldset class="control-group">
<label class="control-label" for="id_{{
field.name }}">{{ field.label }}</label>
<div class="controls">
{{ field }}
<p class="help-text">{{
field.help_text }}</p>
</div>
</fieldset>
{% endfor %}

28
Django Model Forms
class QuestionForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(QuestionForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
instance = super(QuestionForm, self).save(commit=False)
instance.user = self.user
if commit:
instance.save()
return instance
class Meta:
model = Article
fields = ['title', 'content']

29
Генерация HTML страницы
с помощью
шаблонизатора

30
Особенности шаблонизатора
 Шаблоном может быть любой текстовый файл (HTML,
XML, CSV)

 В django все данные передаются в 1 шаблон
return render(request, 'blog/post_list.html', {
'post_list' : object_list
})

 Шаблоны размещают по приложениям
 Переменные выделяются скобками:
{{ email }}

31
Особенности шаблонизатора
 Через точку можно получить свойство, метод, ключ либо
индекс объекта:
{{ object.content }}
{{ name.strip }}
{{ info.avatar }}
{{ post_list.0 }}

 Нельзя вызывать метод с параметрами, но можно чтонибудь удалить:
{{ post_list.order_by('id') }}
{{ post_list.delete }}

32
Особенности шаблонизатора
 Фильтры отделяются чертой | и могут принимать
параметры:
{{ content|safe }}
{{ now|time:"H:i" }}

 Теги выделются скобками с %:
{% if post_list|length > 1%}

{% endif %}

 Однострочные комментарии выдяляются скобками с #:
{# user block #}

33
Особенности шаблонизатора
 Шаблоны наследуются.
 Шаблоны можно вставлять один в другой:
{% include "user.html" with object=user %}

 Шаблоны эскейпят HTML в сущности
 Можно расширять шаблонизатор своими тегами и
фильтрами

34
Наследование шаблонов
Базовый шаблон
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
<title>{% block title %}Мой блог{% endblock %}</title>
{% block extrahead %}{% endblock %}
</head>
<body>
<h1>Мой блог</h1>
{% block content %}{% endblock %}
</body>
</html>
35
Наследование шаблонов
Шаблон страницы
{% extends "base.html" %}
{% block title %}{{ block.super }} - Список{% endblock
%}
{% block content %}
<ul>
{% for object in post_list %}
<li><a href="{{ object.get_absolute_url }}">{{
object }}</a> {{ object.created_date|date:"d.m.Y"
}}</li>
{% endfor %}
</ul>
{% endblock %}
36
Контекстные процессоры
TEMPLATE_CONTEXT_PROCESSORS:
 django.contrib.auth.context_processors.auth (user, perms)

 django.core.context_processors.csrf (csrf_token)
 django.core.context_processors.request (request)
 django.core.context_processors.static (STATIC_URL)

37
Контекстные процессоры
RequestContext и Context
from django.shortcuts import render_to_response
return render_to_response(
'my_template.html', {'foo': 'bar'}
)

from django.shortcuts import render
return render(request,
'my_template.html', {'foo': 'bar'}
)

38
Контекстные процессоры
{% extends "base.html" %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Отправить" />
</form>
{% endblock %}

39
Генерация ответа в JSON

формате

40
Работа с JSON
class AjaxResponse(HttpResponse):
def __init__(self, status, msg,
extra_context=None):
response = {'status': status, 'msg': msg}
if not extra_context is None:
response.update(extra_context)
super(AjaxResponse,
self).__init__(content=json.dumps(response),
content_type='application/json')

41
Работа с JSON
@require_POST
def contact(request):
form = ContactForm(request.POST)
if not form.is_valid():
return AjaxResponse(False, 'Failure!',
json.dumps(form.errors))
return AjaxResponse(True, 'Success!')

42
Отдавать с помощью django основные страницы проекта:
 листинг вопросов с сортировкой

 страница вопроса со списком ответов
 оверлей с формой добавления вопроса
 страница пользователя со списком его вопросов и
ответов.

43
Спасибо за внимание
Александр Бекбулатов,
a.bekbulatov@corp.mail.ru

More Related Content

What's hot

Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
Zestranec
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
Vladimir Rudnyh
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
Roman Brovko
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
Positive Hack Days
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД
Roman Brovko
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
Yura Bogdanov
 
Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)
Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)
Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)Dmitry Evteev
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)Dmitry Evteev
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
Igor Shkulipa
 
Javascript
JavascriptJavascript
Javascript
Vasya Petrov
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
Roman Brovko
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 

What's hot (20)

Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)
Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)
Chaos Constructions HackQuest 2010 Full Disclosure (мастер-класс)
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
176023
176023176023
176023
 
Javascript
JavascriptJavascript
Javascript
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 

Similar to Web осень 2013 лекция 7

django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11dva
 
Webdev7: Обработка HTTP запросов. Django Views
Webdev7: Обработка HTTP запросов. Django ViewsWebdev7: Обработка HTTP запросов. Django Views
Webdev7: Обработка HTTP запросов. Django Views
Technosphere1
 
Django
DjangoDjango
Что нового в Django 1.4
Что нового в Django 1.4Что нового в Django 1.4
Что нового в Django 1.4
Илья Барышев
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7Technopark
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
Введение в Django
Введение в DjangoВведение в Django
Введение в Django
Илья Барышев
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
smikler
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Django Rest Framework vs Graph Ql
Django Rest Framework vs Graph QlDjango Rest Framework vs Graph Ql
Django Rest Framework vs Graph Ql
Attract Group
 
Drf vs Graphql
Drf vs GraphqlDrf vs Graphql
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Vladimir Kochetkov
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
Roman Brovko
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-framework
Яковенко Кирилл
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
dima_kuzovlev
 

Similar to Web осень 2013 лекция 7 (20)

django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
Webdev7: Обработка HTTP запросов. Django Views
Webdev7: Обработка HTTP запросов. Django ViewsWebdev7: Обработка HTTP запросов. Django Views
Webdev7: Обработка HTTP запросов. Django Views
 
Webdev7 (2)
Webdev7 (2)Webdev7 (2)
Webdev7 (2)
 
Django
DjangoDjango
Django
 
Что нового в Django 1.4
Что нового в Django 1.4Что нового в Django 1.4
Что нового в Django 1.4
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Введение в Django
Введение в DjangoВведение в Django
Введение в Django
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Django Rest Framework vs Graph Ql
Django Rest Framework vs Graph QlDjango Rest Framework vs Graph Ql
Django Rest Framework vs Graph Ql
 
Drf vs Graphql
Drf vs GraphqlDrf vs Graphql
Drf vs Graphql
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-framework
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
 

More from Technopark

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
Technopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
Technopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
Technopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
Technopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
Technopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
Technopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
Technopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
Technopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
Technopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
Technopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 

More from Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 

Web осень 2013 лекция 7

  • 2. План лекции 1. Конфигурация Django. 2. Маршрутизация URL. 3. Django Views. 4. Использование Django Forms для обработки входных данных. 5. Генерация HTML страницы с помощью шаблонизатора. 2
  • 4. Конфигурация Django DEBUG = False? • Шаблоны 404.html и 500.html вместо отладочных • Ошибки высылаются на почту (ADMINS) либо LOGGING (http://tp.mail.ru/blog/Web/571.html) • SuspiciousOperation: Invalid HTTP_HOST header (ALLOWED_HOSTS) • Запросы и тайминги хранятся в django.db.connection 4
  • 5. Конфигурация Django Другие важные настройки • DATABASES • INSTALLED_APPS • TEMPLATE_DIRS • ROOT_URLCONF • MEDIA_ROOT, MEDIA_URL • STATIC_ROOT, STATIC_URL 5
  • 6. Конфигурация Django Относительные пути import os.path def rel(*x): return os.path.join( os.path.abspath(os.path.dirname(__file__)), *x) TEMPLATE_DIRS = ( rel('../templates'), ) 6
  • 7. Конфигурация Django Паттерн local_settings try: from ask_pupkin.local_settings import * except ImportError: pass 7
  • 9. Маршрутизация URL Маршрутизация проекта urlpatterns = patterns('', url(r'^$', 'blog.views.home', name='home'), url(r'^', include(contacts.urls')), url(r'^admin/', include(admin.site.urls)), ) Маршрутизация приложения urlpatterns = patterns('blog.views', url(r'^$', 'post_list', name='post_list'), url(r'^category/(d+)/$', 'category’, name='post_list_by_category'), url(r'^(?P<pk>d+)/$', ' post_detail', name='post_detail'), ) 9
  • 11. Django Views Требования к контроллерам  Должны быть callable объектом  Должны принимать HttpRequest первым параметром  Должны возвращать HttpResponse 11
  • 12. Django Views def post_list(request): object_list = Post.objects.all()[:20] return render(request, 'blog/post_list.html', {'post_list' : object_list} ) def post_detail(request, pk): try: object = Post.objects.get(pk=pk) except Post.DoesNotExist: raise Http404 return render(request, 'blog/post_detail.html', {'object': object} ) 12
  • 13. Django Views def category(request, pk): cat = get_object_or_404(Category, pk=pk) post_list = Post.objects.filter(category=cat) return render(request, 'blog/category.html', { 'category': cat, 'post_list' : post_list }) 13
  • 14. Захват и передача параметров из URL во View Захват параметров url(r'^category/(d+)/$', 'category’, name='post_list_by_category') url(r'^(?P<pk>d+)/$', 'post_detail', name='post_detail') Передача во View def category(request, pk=None): if pk is None: # вывести все посты def category(request, *args, **kwargs): pk = args[0] pk = kwargs['pk'] 14
  • 15. HttpRequest Свойства • request.method • request.GET • request.POST • request.COOKIES • request.FILES • request.META Методы • request.get_full_path() • request.build_absolute_uri() • request.is_ajax() 15
  • 16. HttpResponse def get_time(request): now = datetime.datetime.now() return HttpResponse( "It is now %s" % now, content_type="text/plain") Классы с другим кодом возврата • HttpResponseRedirect • HttpResponsePermanentRedirect • HttpResponseNotFound • HttpResponseForbidden 16
  • 17. Получение GET и POST параметров GET page = request.GET.get('page') or 1 try: return int(page) except ValueError: raise Http404 order = request.GET.get('sort') if order == 'rating': queryset = queryset.order_by('rating') 17
  • 18. Получение GET и POST параметров POST message = request.POST.get('message') sender = request.POST.get('email') if message and sender: send_mail('[My Blog]', message, sender, ['me@mail.ru']) 18
  • 19. Получение и установка HTTP заголовков if request.META.get('REMOTE_ADDR', None) in INTERNAL_IPS: response.content += debug_output response = HttpResponse(my_data, content_type='application/vnd.ms-excel') response['Content-Disposition'] = 'attachment; filename="foo.xls"' 19
  • 20. Получение и установка Cookie Установка response = render(request, 'blog/index.html') response.set_cookie('visited', '1') return response Получение if not request.COOKIES.get('visited'): show_banner = True 20
  • 21. Использование Django Forms для обработки входных данных 21
  • 22. Django Forms from django import forms class ContactForm(forms.Form): email = forms.EmailField(max_length=100) message = forms.CharField(widget=forms.Textarea) def clean_message(self): message = self.cleaned_data.get('message') if not check_antispam(message): raise form.ValidationError('Spam detected!') 22
  • 23. Django Forms Свойства полей формы https://docs.djangoproject.com/en/dev/ref/models/fields/ 23
  • 24. Django Forms API >>> f = ContactForm() >>> data = {'email': 'foo@example.com', 'message': 'Hi there'} >>> f = ContactForm(data) >>> f.is_valid() True >>> f.cleaned_data {'email': u'foo@example.com', 'message': u'Hi there'} >>> f = ContactForm({}) >>> f.is_valid() False >>> f.errors {'email': [u'Enter a valid e-mail address.'], 'message': [u'This field is required.']} 24
  • 25. Django Forms API >>> f = ContactForm() >>> print f.as_table() <tr><th><label for="id_for_email">Ваш email:</label></th><td><input id="id_for_ email " type="text" name="email" maxlength="100" /></td></tr>… >>> print f.email ><input id="id_for_ email " type="text" name="email" maxlength="100" /> 25
  • 26. Django Forms def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): message = form.cleaned_data['message'] sender = form.cleaned_data['email'] recipients = send_mail('My Blog', message, sender, ['me@mail.ru']) return HttpResponseRedirect('/') else: form = ContactForm() return render(request, 'blog/contact.html', { 'form': form }) 26
  • 27. Django Forms Визуализация  Выводить поля по одному и оборачивать div  Использовать сторонние приложения 27
  • 28. Django Forms Визуализация {% for field in form %} <fieldset class="control-group"> <label class="control-label" for="id_{{ field.name }}">{{ field.label }}</label> <div class="controls"> {{ field }} <p class="help-text">{{ field.help_text }}</p> </div> </fieldset> {% endfor %} 28
  • 29. Django Model Forms class QuestionForm(forms.ModelForm): def __init__(self, *args, **kwargs): self.user = kwargs.pop('user', None) super(QuestionForm, self).__init__(*args, **kwargs) def save(self, commit=True): instance = super(QuestionForm, self).save(commit=False) instance.user = self.user if commit: instance.save() return instance class Meta: model = Article fields = ['title', 'content'] 29
  • 30. Генерация HTML страницы с помощью шаблонизатора 30
  • 31. Особенности шаблонизатора  Шаблоном может быть любой текстовый файл (HTML, XML, CSV)  В django все данные передаются в 1 шаблон return render(request, 'blog/post_list.html', { 'post_list' : object_list })  Шаблоны размещают по приложениям  Переменные выделяются скобками: {{ email }} 31
  • 32. Особенности шаблонизатора  Через точку можно получить свойство, метод, ключ либо индекс объекта: {{ object.content }} {{ name.strip }} {{ info.avatar }} {{ post_list.0 }}  Нельзя вызывать метод с параметрами, но можно чтонибудь удалить: {{ post_list.order_by('id') }} {{ post_list.delete }} 32
  • 33. Особенности шаблонизатора  Фильтры отделяются чертой | и могут принимать параметры: {{ content|safe }} {{ now|time:"H:i" }}  Теги выделются скобками с %: {% if post_list|length > 1%} {% endif %}  Однострочные комментарии выдяляются скобками с #: {# user block #} 33
  • 34. Особенности шаблонизатора  Шаблоны наследуются.  Шаблоны можно вставлять один в другой: {% include "user.html" with object=user %}  Шаблоны эскейпят HTML в сущности  Можно расширять шаблонизатор своими тегами и фильтрами 34
  • 35. Наследование шаблонов Базовый шаблон <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>{% block title %}Мой блог{% endblock %}</title> {% block extrahead %}{% endblock %} </head> <body> <h1>Мой блог</h1> {% block content %}{% endblock %} </body> </html> 35
  • 36. Наследование шаблонов Шаблон страницы {% extends "base.html" %} {% block title %}{{ block.super }} - Список{% endblock %} {% block content %} <ul> {% for object in post_list %} <li><a href="{{ object.get_absolute_url }}">{{ object }}</a> {{ object.created_date|date:"d.m.Y" }}</li> {% endfor %} </ul> {% endblock %} 36
  • 37. Контекстные процессоры TEMPLATE_CONTEXT_PROCESSORS:  django.contrib.auth.context_processors.auth (user, perms)  django.core.context_processors.csrf (csrf_token)  django.core.context_processors.request (request)  django.core.context_processors.static (STATIC_URL) 37
  • 38. Контекстные процессоры RequestContext и Context from django.shortcuts import render_to_response return render_to_response( 'my_template.html', {'foo': 'bar'} ) from django.shortcuts import render return render(request, 'my_template.html', {'foo': 'bar'} ) 38
  • 39. Контекстные процессоры {% extends "base.html" %} {% block content %} <form action="" method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" value="Отправить" /> </form> {% endblock %} 39
  • 40. Генерация ответа в JSON формате 40
  • 41. Работа с JSON class AjaxResponse(HttpResponse): def __init__(self, status, msg, extra_context=None): response = {'status': status, 'msg': msg} if not extra_context is None: response.update(extra_context) super(AjaxResponse, self).__init__(content=json.dumps(response), content_type='application/json') 41
  • 42. Работа с JSON @require_POST def contact(request): form = ContactForm(request.POST) if not form.is_valid(): return AjaxResponse(False, 'Failure!', json.dumps(form.errors)) return AjaxResponse(True, 'Success!') 42
  • 43. Отдавать с помощью django основные страницы проекта:  листинг вопросов с сортировкой  страница вопроса со списком ответов  оверлей с формой добавления вопроса  страница пользователя со списком его вопросов и ответов. 43
  • 44. Спасибо за внимание Александр Бекбулатов, a.bekbulatov@corp.mail.ru