Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Django. Дополнительные
темы.
Django Views
СергейЛихобабин
Техносфера.2014
Еще несколько слов о manage.py
Middleware
Сессии
Приложение auth
Class Based Views
Расширение фильтров итэгов в шаблонизаторе
Другие приложения из коробки
Оптимизация производительности
Management команды
Standalone скрипты
Задачидля cron'а
Пример команды
classCommand(BaseCommand):
help='Filldatabasewithtestdata'
defhandle(self,*args,**options):
foriinxrange(USER_COUNT):
user=User(
name=get_random_string(10),
email=get_random_email()
)
user.save()
self.stdout.write(
'Imported%dusers'%USER_COU
)
Middleware
Л8 Django. Дополнительные темы
Сценарии использования
Обработка запроса
Статистика
Аутентификация
Защита отCSRF
Редиректы
Кеширование
Л8 Django. Дополнительные темы
CSRF в Django
«Небезопасные» методы POST, PUTиDELETE
Установка cookie (csrftoken)
Установка hidden поля (csrfmiddlewaretoken) или
заголовка (X-CSRFToken)
Важные моменты
Для установкикукистраница должна отдаваться
динамически
Кука можетне ставиться, еслипередача
контекста идетчерез Contextвместо
RequestContext
Скрытое поле ставится тегом {%csrf_token %},
используйте RequestContext(функция render)
Токенв ajax запросахудобнее передавать
заголовком
Сессии
Сессиив БД
Фаиловые сессии
Сессиив куках
Использование сессий
deflogin(request):
username=request.POST.get('username')
try:
user=User.objects.get(username=username)
exceptUser.DoesNotExist:
returnHttpResponse("Nosuchuser")
ifuser.check_password(request.POST.get('password')
request.session['user_id']=user.id
returnHttpResponse("You'reloggedin.")
else:
returnHttpResponse("Wrongcredentials.")
Использование сессий
deflogout(request):
try:
delrequest.session['user_id']
exceptKeyError:
pass
returnHttpResponse("You'reloggedout.")
Декораторы
Пример декоратора
defmakebold(fn):
defwrapped():
return"<b>"+fn()+"</b>"
returnwrapped
defmakeitalic(fn):
defwrapped():
return"<i>"+fn()+"</i>"
returnwrapped
Пример декоратора
@makebold
@makeitalic
defhello():
return"helloworld"
//hello=makebold(makeitalic(hello))
printhello()##returns<b><i>helloworld</i></b>
Декораторы для Django
views
@require_POST
defvote_view(request):
#onlyPOSTmethodisallowed
pass
либо
url(r"^vote/",require_POST(vote)),
Декораторы для Django
views
Проверка HTTP-методов
Проверка прав доступа
Кеширование
Django auth
Возможности Django auth
Пользователи
Проверка прав доступа
Обработчикиlogin/logout
Интеграция с админкой
Кастомизация моделипользователя
Проверка авторизации во
views
defmy_view(request):
ifnotrequest.user.is_authenticated():
returnredirect(
'/login/?next=%s'%request.pa
)
user=request.user
@login_required
defmy_view(request):
...
Проверка авторизации в
шаблонах
{%ifuser.is_authenticated%}
Welcome,{{user.username}}
{%else%}
Pleaselogin.
{%endif%}
Class based views
Функция-обработчик.
Пример 1
defpost_detail(request,pk):
try:
object=Post.objects.get(pk=pk)
exceptPost.DoesNotExist:
raiseHttp404
returnrender(
request,'blog/post_detail.html',
{'object':object}
)
urlpatterns=patterns('',
url(
r'^post/(?P<pk>d+)/$',
post_detail,name= 'post_detail'
),
)
Класс-обработчик. Пример 1
classPostDetail(generic.DetailView):
model=Post
urlpatterns=patterns('',
url(
r'^post/(?P<pk>d+)/$',
PostDetail.as_view(),name= 'post_detai
),
)
Функция-обработчик.
Пример 2
defpost_list(request):
paginator=Paginator(Post.objects.all(),25)
page=request.GET.get('page')
try:
posts=paginator.page(page)
exceptPageNotAnInteger:
posts=paginator.page(1)
exceptEmptyPage:
posts=paginator.page(paginator.num_pages)
returnrender(
request,'blog/post_list.html',
{'object_list':posts}
)
Класс-обработчик. Пример
2
classPostList(generic.ListView):
model=Post
paginate_by=25
Функция-обработчик.
Пример 3
@login_required
defcategory(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
})
Класс-обработчик. Пример
3
classCategoryListView(generic.ListView):
template_name='blog/category.html'
defget_queryset(self):
self.cat=get_object_or_404(
Category,pk=self.kwargs['pk']
)
returnPost.objects.filter(category=self.cat)
@method_decorator(login_required)
defdispatch(self,*args,**kwargs):
returnsuper(CategoryListView,self).dispatch(*
defget_context_data(self,**kwargs):
context=super(CategoryListView,self).get_con
context['category']=self.cat
Полезный справочник по
CBV
http://ccbv.co.uk/
Фильтры и теги в
шаблонизаторе
Построение урлов
classPost(models.Model):
@models.permalink
defget_absolute_url(self):
return('post_detail',(self.pk,))
#либо
defget_absolute_url(self):
returnreverse('post_detail',args=(self.pk,))
Построение урлов
<ahref="{{post.get_absolute_url}}">{{post}}</a>
<ahref="{%url'post_detail'post.pk%}">{{post}}</a
Фильтры и теги
Фильтры и теги
Тэг присваивания
Блочныйтэг
{%get_current_time
"%Y-%m-%d%I:%M%p"asthe_time%}
{%switch%}{%endswitch%}
Пример регистрации тэга
fromdjangoimporttemplate
fromblog.modelsimportPost
register=template.Library()
@register.inclusion_tag('blog/tags/lastposts.html')
deflast_posts():
return{'post_list':Post.objects.all()[:5]}
Использование в шаблонах
{%loadblog_tags%}
{%last_posts%}
<ul>
{%forobjectinpost_list%}
<li>
<ahref="{{object.get_absolute_url}}">
{{object}}
</a>
</li>
{%endfor%}
</ul>
Оптимизация
производительности
Особенности кэша
Быстрыйдоступк кешу
Высокая вероятность использования кеша
Временное хранилище
Кэш-бэкенды в Django
Memcached
База данных
Файловая система
Локальная память
Dummy(для разработки)
Уровни кэширования
Весь сайт
Контроллер
Часть шаблона
Часть данных(ручное управление)
Performance Best-practice
Профилируйте страницы с Django DebugToolbar
Используйте правильные индексы (db_index)
Делайте выборкипо тем полям, которые вам
нужны (методы only, values and values_list)
Доставайте только те объекты, которые будут
использованы
Не делайте лишнихзапросов к БД
Python не долженделать работуза БД(методы
count, exist)
DRY
KISS
Спасибо за внимание
СергейЛихобабин
s.lihobabin@corp.mail.ru

More Related Content

Л8 Django. Дополнительные темы