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

Webdev7: Обработка HTTP запросов. Django Views

Jul 02, 2015

Download

Software

Technosphere1

Webdev7: Обработка HTTP запросов. Django Views
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Webdev7: Обработка HTTP запросов. Django Views

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

Django Views

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

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

Page 2: Webdev7: Обработка HTTP запросов. Django Views

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

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

Django Views

Django Forms

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

Page 3: Webdev7: Обработка HTTP запросов. Django Views

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

Page 4: Webdev7: Обработка HTTP запросов. Django Views

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

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

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

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

Page 5: Webdev7: Обработка HTTP запросов. Django Views

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

DATABASES

INSTALLED_APPS

TEMPLATE_DIRS

ROOT_URLCONF

MEDIA_ROOT, MEDIA_URL

STATIC_ROTT, STATIC_URL

Page 6: Webdev7: Обработка HTTP запросов. Django Views

Относительные пути 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: Обработка HTTP запросов. Django Views

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

Page 8: Webdev7: Обработка HTTP запросов. Django Views

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

Page 9: Webdev7: Обработка HTTP запросов. Django Views

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

Page 10: Webdev7: Обработка HTTP запросов. Django Views

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

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: Обработка HTTP запросов. Django Views

Django Views

Page 12: Webdev7: Обработка HTTP запросов. Django Views

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

Callable объект

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

Возвращает HttpResponse

Page 13: Webdev7: Обработка HTTP запросов. Django Views

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

Page 14: Webdev7: Обработка HTTP запросов. Django Views

Примеры обработчиков 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: Обработка HTTP запросов. 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 })

Page 16: Webdev7: Обработка HTTP запросов. Django Views

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

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: Обработка HTTP запросов. Django Views

Свойства HttpRequestrequest.method

request.GET

request.POST

request.COOKIES

request.FILES

request.META

Page 18: Webdev7: Обработка HTTP запросов. Django Views

Методы HttpRequestrequest.get_full_path()

request.build_absolute_uri()

request.is_ajax()

request.get_signed_cookie()

Page 19: Webdev7: Обработка HTTP запросов. Django Views

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

Page 20: Webdev7: Обработка HTTP запросов. Django Views

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

HttpResponseRedirect

HttpResponsePermanentRedirect

HttpResponseForbidden

HttpResponseNotFound

Page 21: Webdev7: Обработка HTTP запросов. Django Views

Получение 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: Обработка HTTP запросов. Django Views

Получение 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: Обработка HTTP запросов. Django Views

Получение и выставление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: Обработка HTTP запросов. Django Views

Получение и выставление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: Обработка HTTP запросов. Django Views

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: Обработка HTTP запросов. Django Views

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

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: Обработка HTTP запросов. Django Views

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: Обработка HTTP запросов. Django Views

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: Обработка HTTP запросов. Django Views

Обработка формы 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: Обработка HTTP запросов. Django Views

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

{% 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: Обработка HTTP запросов. Django Views

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: Обработка HTTP запросов. Django Views

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

Page 33: Webdev7: Обработка HTTP запросов. Django Views

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

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

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

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

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

Page 34: Webdev7: Обработка HTTP запросов. Django Views

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

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

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

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

Page 35: Webdev7: Обработка HTTP запросов. Django Views

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

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

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

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

Page 36: Webdev7: Обработка HTTP запросов. Django Views

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

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

Page 37: Webdev7: Обработка HTTP запросов. Django Views

Примеры шаблонов <!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: Обработка HTTP запросов. Django Views

Примеры шаблонов {% 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: Обработка HTTP запросов. Django Views

Контектсные процессоры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: Обработка HTTP запросов. Django Views

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: Обработка HTTP запросов. Django Views

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

Page 42: Webdev7: Обработка HTTP запросов. Django Views

Ответ в 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: Обработка HTTP запросов. Django Views

Ответ в 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: Обработка HTTP запросов. Django Views

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

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

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