Webdev7 (2)

44
Обработка запросов Django Views Сергей Лихобабин Техносфера . 2014

Transcript of Webdev7 (2)

Page 1: Webdev7 (2)

Обработка запросов

Django Views

Сергей Лихобабин

Техносфера. 2014

Page 2: Webdev7 (2)

План лекцииКонфигурация Django

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

Django Views

Django Forms

Работа с шаблонами

Page 3: Webdev7 (2)

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

Page 4: Webdev7 (2)

Опция DebugОтображение отладочных страниц вместо404.html и 500.html

Отображение ошибок в лое вместо отправки напочту (настройки LOGGING)

Не учитывается ALLOWED_HOSTS

Лог запросов сохраняется вdjango.db.connection

Page 5: Webdev7 (2)

Другие важныенастройки

DATABASES

INSTALLED_APPS

TEMPLATE_DIRS

ROOT_URLCONF

MEDIA_ROOT, MEDIA_URL

STATIC_ROTT, STATIC_URL

Page 6: Webdev7 (2)

Относительные пути import os.path

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

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

Page 7: Webdev7 (2)

local_settings try: from myproject.local_settings import *except ImportError: pass

Page 8: Webdev7 (2)

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

Page 9: Webdev7 (2)

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

Page 10: Webdev7 (2)

Маршрутизацияприложения

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' ),

</pk>

Page 11: Webdev7 (2)

Django Views

Page 12: Webdev7 (2)

Требования кобработчикам

Callable объект

Первый параметр - HttpRequest

Возвращает HttpResponse

Page 13: Webdev7 (2)

Примеры обработчиков def post_list(request): object_list = Post.objects.all()[:20] return render(request, 'blog/post_list.html', {'post_list' : object_list} )

Page 14: Webdev7 (2)

Примеры обработчиков 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} )

Page 15: Webdev7 (2)

Примеры обработчиков 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 })

Page 16: Webdev7 (2)

Передача парметров вобработчик

url( r'̂category/(\d+)/$', 'category’, name='post_list_by_category'

url( r'̂(?P<pk>\d+)/$', 'post_detail', name='post_detail'

def category(request, *args, **kwargs): pk = args[0]

def post_detail(request, pk=None): if pk is None: # возвращаем какую-то ошибку </pk>

Page 17: Webdev7 (2)

Свойства HttpRequestrequest.method

request.GET

request.POST

request.COOKIES

request.FILES

request.META

Page 18: Webdev7 (2)

Методы HttpRequestrequest.get_full_path()

request.build_absolute_uri()

request.is_ajax()

request.get_signed_cookie()

Page 19: Webdev7 (2)

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

Page 20: Webdev7 (2)

Шорткаты для кодоввозврата

HttpResponseRedirect

HttpResponsePermanentRedirect

HttpResponseForbidden

HttpResponseNotFound

Page 21: Webdev7 (2)

Получение GET и POSTпараметров

page = request.GET.get('page') or 1try: return int(page)except ValueError: raise Http404

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

queryset = queryset.order_by('rating')

Page 22: Webdev7 (2)

Получение GET и POSTпараметров

message = request.POST.get('message')sender = request.POST.get('email') message and sender:

send_mail( '[My Blog]', message, sender, ['[email protected]'] )

Page 23: Webdev7 (2)

Получение и выставлениеHTTP заголовков

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"'

Page 24: Webdev7 (2)

Получение и выставлениеCookie

response = render(request, 'blog/index.html')response.set_cookie('visited', '1') return response

not request.COOKIES.get('visited'): show_banner = True

Page 25: Webdev7 (2)

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!')

Page 26: Webdev7 (2)

Поля форм на все случаижизни

BooleanField, CharField, ChoiceField, TypedChoiceField,DateField, DateTimeField, DecimalField, EmailField, FileField,

FilePathField, FloatField, ImageField, IntegerField,MultipleChoiceField, TypedMultipleChoiceField,

NullBooleanField, RegexField, SlugField, TimeField, URLField,ComboField, MultiValueField, SplitDateTimeField,

ModelChoiceField, ModelMultipleChoiceField

Page 27: Webdev7 (2)

Forms API >>> f = ContactForm()>>> data = {'email': '[email protected]', 'message': 'Hi there'>>> f = ContactForm(data)>>> f.is_valid()True>>> f.cleaned_data 'email': u'[email protected]', '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.']

Page 28: Webdev7 (2)

Forms API >>> f = ContactForm()>>> print f.as_table()<tr> <th><label for="id_for_email">Ваш e-mail:</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" />

Page 29: Webdev7 (2)

Обработка формы 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, ['[email protected]'] ) return HttpResponseRedirect('/') else: form = ContactForm()

return render(request, 'blog/contact.html', { 'form': form })

Page 30: Webdev7 (2)

Вывод формы настраницу

{% for field in form %} <fieldset class="control-group"> <label class="control-label" for="id_{{ field.name }}">{{ <div class="controls"> {{ field }} <p class="help-text">{{ field.help_text }}</p> </div> </fieldset>{% endfor %}

Page 31: Webdev7 (2)

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']

Page 32: Webdev7 (2)

Шаблонизатор Django

Page 33: Webdev7 (2)

Особенностишаблонизатора

Шаблон - любой текстовый фаил

Шаблоны наследуются

Шаблоны встраиваются

Шаблоны не компилируются

Page 34: Webdev7 (2)

ШаблонизаторВставка значения переменной {{var}}

Через точку можно получить аттрибут, вызватьметод, обратиться к элементу словаря илимассива

Методы вызываются без параметров

{{object.content}}{{name.strip}}{{dict.key}}{{somelist.0}}

Page 35: Webdev7 (2)

ШаблонизаторФильтры могут принимать параметры

Тэги - логика в шаблонах

{{ content|safe }}{{ now|time:"H:i" }}

{% if post_list|length > 1%} {% endif %}

Page 36: Webdev7 (2)

ШаблонизаторВыводимые переменные автоматическиэскейпятся

Шаблонизатор можно расширять кастомнымитэгами и фильтрами

Page 37: Webdev7 (2)

Примеры шаблонов <!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>

Page 38: Webdev7 (2)

Примеры шаблонов {% 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 %}

Page 39: Webdev7 (2)

Контектсные процессоры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)

Page 40: Webdev7 (2)

Context и RequestContext from django.shortcuts import render_to_responsereturn render_to_response( 'my_template.html', {'foo': 'bar'}

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

Page 41: Webdev7 (2)

Ответ на запрос в JSONформате

Page 42: Webdev7 (2)

Ответ в 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' )

Page 43: Webdev7 (2)

Ответ в JSON @require_POSTdef contact(request): form = ContactForm(request.POST) if not form.is_valid(): return AjaxResponse(False, 'Failure!', json.dumps(for return AjaxResponse(True, 'Success!')

Page 44: Webdev7 (2)

Домашнее заданиеНаписать обработчики для основных страниц проекта

Списки сущностей и страницы отдельныхсущностей

Отображение форм