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

PPTX
Web осень 2013 лекция 8
PDF
Web осень 2013 лекция 6
PPTX
Web осень 2013 лекция 5
PPTX
Web осень 2013 лекция 9
PPTX
Web осень 2013 лекция 4
PDF
Web осень 2013 лекция 2
PDF
Web осень 2013 лекция 3
PDF
Web осень 2013 лекция 1
Web осень 2013 лекция 8
Web осень 2013 лекция 6
Web осень 2013 лекция 5
Web осень 2013 лекция 9
Web осень 2013 лекция 4
Web осень 2013 лекция 2
Web осень 2013 лекция 3
Web осень 2013 лекция 1

What's hot (20)

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

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

PDF
django cheBit'11
 
PPT
Django шахрай. версия 4
PDF
14 - Web-технологии. Обработка форм
PDF
Лекция #6. Введение в Django web-framework
PDF
13 - Web-технологии. Отображение данных
PDF
09 - Web-технологии. MVC фреймворки
PPT
Введение в Django
PDF
Webdev7: Обработка HTTP запросов. Django Views
PDF
Webdev7 (2)
PPT
Web весна 2012 лекция 7
PDF
12 - Web-технологии. Django модели
PPT
Web весна 2012 лекция 4
PPT
Web осень 2012 лекция 4
PDF
Что нового в Django 1.4
PDF
Лекция #7. Django ORM
PPT
Py con 2010_django_project_dev_full_circle
PPT
Мульти-доменность в Django проекте
PPT
Django. Web project full circle
PPT
Django. Web project full circle
django cheBit'11
 
Django шахрай. версия 4
14 - Web-технологии. Обработка форм
Лекция #6. Введение в Django web-framework
13 - Web-технологии. Отображение данных
09 - Web-технологии. MVC фреймворки
Введение в Django
Webdev7: Обработка HTTP запросов. Django Views
Webdev7 (2)
Web весна 2012 лекция 7
12 - Web-технологии. Django модели
Web весна 2012 лекция 4
Web осень 2012 лекция 4
Что нового в Django 1.4
Лекция #7. Django ORM
Py con 2010_django_project_dev_full_circle
Мульти-доменность в Django проекте
Django. Web project full circle
Django. Web project full circle
Ad

More from Technopark (20)

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