Обработка запросов
Django Views
СергейЛихобабин
Техносфера.2014
План лекции
Конфигурация Django
Маршрутизация URL
Django Views
Django Forms
Работа с шаблонами
Конфигурация Django
Опция Debug
Отображение отладочных страниц вместо
404.htmlи 500.html
Отображение ошибок в лое вместо отправки на
почту (настройки LOGGING)
Не учитывается ALLOWED_HOSTS
Лог запросов сохраняется в
django.db.connection
Другие важные
настройки
DATABASES
INSTALLED_APPS
TEMPLATE_DIRS
ROOT_URLCONF
MEDIA_ROOT, MEDIA_URL
STATIC_ROTT, STATIC_URL
Относительные пути
mportos.path
efrel(*x):
returnos.path.join(
os.path.abspath(
os.path.dirname(__file__)
),
*x
)
EMPLATE_DIRS=(
rel('../templates'),
local_settings
ry:
frommyproject.local_settingsimport*
xceptImportError:
pass
Маршрутизация URL
Маршрутизация проекта
rlpatterns=patterns('',
url(r'^$','blog.views.home',name='home'),
url(r'^',include(contacts.urls')),
url(r'^admin/',include(admin.site.urls)),
Маршрутизация
приложения
rlpatterns=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>
Django Views
Требования к
обработчикам
Callable объект
Первый параметр -HttpRequest
Возвращает HttpResponse
Примеры обработчиков
efpost_list(request):
object_list=Post.objects.all()[:20]
returnrender(request,'blog/post_list.html',
{'post_list':object_list}
)
Примеры обработчиков
efpost_detail(request,pk):
try:
object=Post.objects.get(pk=pk)
exceptPost.DoesNotExist:
raiseHttp404
returnrender(request,'blog/post_detail.html',
{'object':object}
)
Примеры обработчиков
efcategory(request,pk):
cat=get_object_or_404(Category,pk=pk)
post_list=Post.objects.filter(category=cat)
returnrender(request,'blog/category.html',{
'category':cat,
'post_list':post_list
})
Передача парметров в
обработчик
rl(
r'^category/(d+)/$','category’,
name='post_list_by_category'
rl(
r'^(?P<pk>d+)/$','post_detail',
name='post_detail'
efcategory(request,*args,**kwargs):
pk=args[0]
efpost_detail(request,pk=None):
ifpkisNone:
#возвращаемкакую-тоошибку
</pk>
Свойства HttpRequest
request.method
request.GET
request.POST
request.COOKIES
request.FILES
request.META
Методы HttpRequest
request.get_full_path()
request.build_absolute_uri()
request.is_ajax()
request.get_signed_cookie()
HttpResponse
efget_time(request):
now=datetime.datetime.now()
returnHttpResponse(
"Itisnow%s"%now,
content_type="text/plain"
)
Шорткаты для кодов
возврата
HttpResponseRedirect
HttpResponsePermanentRedirect
HttpResponseForbidden
HttpResponseNotFound
Получение GET и POST
параметров
age=request.GET.get('page')or1
ry:
returnint(page)
xceptValueError:
raiseHttp404
rder=request.GET.get('sort')
order=='rating':
queryset=queryset.order_by('rating')
Получение GET и POST
параметров
essage=request.POST.get('message')
ender=request.POST.get('email')
messageandsender:
send_mail(
'[MyBlog]',message,
sender,['me@mail.ru']
)
Получение и выставление
HTTP заголовков
request.META.get('REMOTE_ADDR',None)inINTERNAL_IPS:
response.content+=debug_output
esponse=HttpResponse(
my_data,content_type='application/vnd.ms-excel'
esponse['Content-Disposition']=
'attachment;filename="foo.xls"'
Получение и выставление
Cookie
esponse=render(request,'blog/index.html')
esponse.set_cookie('visited','1')
eturnresponse
notrequest.COOKIES.get('visited'):
show_banner=True
Django Forms
romdjangoimportforms
lassContactForm(forms.Form):
email=forms.EmailField(max_length=100)
message=forms.CharField(widget=forms.Textarea)
defclean_message(self):
message=self.cleaned_data.get('message')
ifnotcheck_antispam(message):
raiseform.ValidationError('Spamdetected!')
Поля форм на все случаи
жизни
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
Forms API
>>f=ContactForm()
>>data={'email':'foo@example.com','message':'Hithere'
>>f=ContactForm(data)
>>f.is_valid()
rue
>>f.cleaned_data
'email':u'foo@example.com','message':u'Hithere'}
>>f=ContactForm({})
>>f.is_valid()
alse
>>f.errors
'email':[u'Enteravalide-mailaddress.'],
'message':[u'Thisfieldisrequired.']
Forms API
>>f=ContactForm()
>>printf.as_table()
tr>
<th><labelfor="id_for_email">Вашe-mail:</label></th>
<td><inputid="id_for_email"
type="text"name="email"maxlength="100"/>
</td>
/tr>…
>>printf.email
inputid="id_for_email"type="text"
name="email"maxlength="100"/>
Обработка формы
efcontact(request):
ifrequest.method=='POST':
form=ContactForm(request.POST)
ifform.is_valid():
message=form.cleaned_data['message']
sender=form.cleaned_data['email']
recipients=send_mail(
'MyBlog',message,sender,['me@mail.ru']
)
returnHttpResponseRedirect('/')
else:
form=ContactForm()
returnrender(request,'blog/contact.html',{
'form':form
})
Вывод формы на
страницу
%forfieldinform%}
<fieldsetclass="control-group">
<labelclass="control-label"for="id_{{field.name}}
<divclass="controls">
{{field}}
<pclass="help-text">{{field.help_text}}</p>
</div>
</fieldset>
%endfor%}
Model Forms
lassQuestionForm(forms.ModelForm):
def__init__(self,*args,**kwargs):
self.user=kwargs.pop('user',None)
super(QuestionForm,self).__init__(*args,**kwargs)
defsave(self,commit=True):
instance=super(QuestionForm,self).save(commit=Fals
instance.user=self.user
ifcommit:
instance.save()
returninstance
classMeta:
model=Article
fields=['title','content']
Шаблонизатор Django
Особенности
шаблонизатора
Шаблон -любой текстовый фаил
Шаблоны наследуются
Шаблоны встраиваются
Шаблоны не компилируются
Шаблонизатор
Вставка значения переменной {{var}}
Через точку можно получить аттрибут, вызвать
метод, обратиться к элементу словаря или
массива
Методы вызываются без параметров
{{object.content}}
{{name.strip}}
{{dict.key}}
{{somelist.0}}
Шаблонизатор
Фильтры могут принимать параметры
Тэги -логика в шаблонах
{{content|safe}}
{{now|time:"H:i"}}
{%ifpost_list|length>1%} {%endif%}
Шаблонизатор
Выводимые переменные автоматически
эскейпятся
Шаблонизатор можно расширять кастомными
тэгами и фильтрами
Примеры шаблонов
!DOCTYPEHTML>
html>
head>
<metahttp-equiv="Content-Type"
content="text/html;charset=utf-8">
<title>
{%blocktitle%}Мойблог{%endblock%}
</title>
{%blockextrahead%}{%endblock%}
head>
body>
<h1>Мойблог</h1>
{%blockcontent%}{%endblock%}
body>
html>
Примеры шаблонов
%extends"base.html"%}
%blocktitle%}{{block.super}}-Список{%endblock%}
%blockcontent%}
<ul>
{%forobjectinpost_list%}
<li>
<ahref="{{object.get_absolute_url}}">
{{object}}
</a>
{{object.created_date|date:"d.m.Y"}}
</li>
{%endfor%}
</ul>
%endblock%}
Контектсные процессоры
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)
Context и RequestContext
romdjango.shortcutsimportrender_to_response
eturnrender_to_response(
'my_template.html',{'foo':'bar'}
romdjango.shortcutsimportrender
eturnrender(request,
'my_template.html',{'foo':'bar'}
Ответ на запрос в JSON
формате
Ответ в JSON
lassAjaxResponse(HttpResponse):
def__init__(self,status,msg,extra_context=None):
response={'status':status,'msg':msg}
ifnotextra_contextisNone:
response.update(extra_context)
super(AjaxResponse,self).__init__(
content=json.dumps(response),
content_type='application/json'
)
Ответ в JSON
require_POST
efcontact(request):
form=ContactForm(request.POST)
ifnotform.is_valid():
returnAjaxResponse(False,'Failure!',json.dumps(for
returnAjaxResponse(True,'Success!')
Домашнее задание
Написать обработчики для основных страниц проекта
Списки сущностей и страницы отдельных
сущностей
Отображение форм

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