Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Django.
Дополнительные
темы

Александр Бекбулатов
План лекции
1. Скрипт управления django приложением.

2. Middleware.
3. Использование сессий.
4. Приложение auth.
5. Class Based Views.
6. Расширение фильтров и тэгов в
шаблонизаторе.
7. Другие приложения из коробки.
8. Оптимизация производительности
2
Скрипт управления django
приложением

3
Управление django приложением
Зачем?
• Standalone скрипты
• Скрипты запуска по крону
Как?
• Ручная инициализация приложения
• Management команды

4
Ручная инициализация
import os
import sys
if __name__ == "__main__":
lib_path = 'path/to/project'
if not lib_path in sys.path:
sys.path.append(lib_path)
os.environ['DJANGO_SETTINGS_MODULE'] = 
'ask_pupkin.settings'
# from django.conf import settings
from ask.models import User
…
5
Management команды
Куда поместить?
ask/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
fill_db.py
tests.py
views.py

6
Management команды
class Command(BaseCommand):
help = 'Fill database with test data'
def handle(self, *args, **options):
verbosity =
int(options.get('verbosity', 1))
for i in xrange(USER_COUNT):
user = User(
name=get_random_string(10),
email=get_random_email()
)
user.save()
if verbosity > 1:
self.stdout.write('Successfully
imported %d users' % USER_COUNT)
7
Управление django приложением
Возможности
• Запуск скриптов для конкретного приложения
(manage.py sqlall ask)
• Несколько команд в одном файле (manage.py
fill_db users, manage.py fill_db questions)
• Дополнительные опции (--delete)

https://docs.djangoproject.com/en/dev/howto/custommanagement-commands/
8
Middleware

9
Middleware

10
Middleware
Примеры
• Обработка запроса
• Статистика
• Аутентификация
• Защита от CSRF
• Редиректы
• Кеширование

11
CSRF Атака

12
CSRF в Django
• «Небезопасные» методы POST, PUT и DELETE
• Установка cookie (csrftoken)
• Установка hidden поля (csrfmiddlewaretoken)
или заголовка (X-CSRFToken)

13
CSRF в Django
1. Для установки куки страница должна отдаваться
динамически
2. Кука может не ставиться, если передача контекста
идет через Context вместо RequestContext
3. Скрытое поле ставится тегом {% csrf_token
%}, используйте RequestContext (функция render)
4. Токен в ajax запросах удобнее передавать заголовком

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
14
Использование сессий
Способы хранения
• Файловые сессии
• Сессии в БД
• Сессии в куках

15
Использование сессий
def login(request):
username = request.POST.get('username')
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return HttpResponse("Such user is not
created.")
# bad practice!!!
if user.password ==
request.POST.get('password'):
request.session['user_id'] = user.id
return HttpResponse("You're logged in.")
else:
return HttpResponse("Your username and
password didn't match.")
16
Использование сессий
def logout(request):
try:
del request.session['user_id']
except KeyError:
pass
return HttpResponse("You're logged out.")

17
Декораторы в python
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped

18
Декораторы в python
@makebold
@makeitalic
def hello():
return "hello world"
// hello = makebold(makeitalic(hello))

print hello() ## returns <b><i>hello world</i></b>

19
Декораторы для Views
@require_POST
def vote_view(request):
# only POST method is allowed
pass
либо
url(r"^vote/", require_POST(vote)),

20
Django Views
Примеры

 Проверка HTTP методов
 Проверка прав доступа
 Кеширование

21
Django Auth

22
Django Auth
Возможности

 Пользователи
 Права и группы доступа
 Контроллеры login/logout

 Тесная интеграция с админкой

23
Django Auth
Модель User
 username (обязательное поле)

 first_name
 last_name
 email

 password (обязательное поле)
 is_staff
 is_active

 is_superuser
 …
24
Django Auth
Создание пользователей
from django.contrib.auth.models import User
user =
User.objects.create_user('masha', 'masha@mail.ru',
'password')

25
Django Auth
Login
def login_view(request):
username = request.POST.get('username')
password = request.POST.get('password')
user =
authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# 'disabled account' error message
else:
# 'invalid login' error message.
26
Django Auth
Logout
def logout_view(request):
logout(request)
# Redirect to a success page.

27
Django Auth
Login/Logout средствами django
1. Подключить в роутинге контроллеры входа и выхода
(r'^accounts/login/$', 'django.contrib.auth.views.logi

n')
(r'^accounts/logout/$', 'django.contrib.auth.views.log
out')

2. Создать шаблоны
registration/login.html
registration/logged_out.html

3. GET параметр next для возврата
28
Django Auth
Login/Logout средствами django
Страница авторизации:
LOGIN_URL = '/accounts/login/'

Страница профиля:
LOGIN_REDIRECT_URL = '/accounts/profile/'

Страница выхода:
LOGOUT_URL = '/accounts/logout/’

https://docs.djangoproject.com/en/dev/topics/auth/default/
29
Django Auth
Проверка авторизации во views
def my_view(request):
if not request.user.is_authenticated():
return redirect('/login/?next=%s' %
request.path)
user = request.user

@login_required
def my_view(request):
...

30
Django Auth
Проверка авторизации в шаблонах
{% if user.is_authenticated %}
Welcome, {{ user.username }}
{% else %}
Please log in.
{% endif %}

31
Django Auth
Расширение текущего пользователя
from django.contrib.auth.models import User

class UserProfile(models.Model):
user =
models.OneToOneField(User, related_name='profile')
rating = models.PositiveIntegerField()

>>> u = User.objects.get(username='masha')
>>> print u.profile.rating

32
Django Auth
Расширение текущего пользователя
• Другой уникальный ключ пользователя (email вместо

username)
• Дополнительные поля (в т. ч. обязательные)

https://docs.djangoproject.com/en/dev/topics/auth/customizing
/#extending-the-existing-user-model

33
Class Based Views

34
Class Based Views
•
•
•

•
•
•
•
•
•
•

•
35
Class Based Views
Контроллер-функция (пример 1)
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}
)
urlpatterns = patterns('',

url(r'^post/(?P<pk>d+)/$', post_detail, name='post
_detail'),
36
)
Class Based Views
Контроллер-класс (пример 1)
class PostDetail(generic.DetailView):
model=Post

urlpatterns = patterns('',
url(r'^post/(?P<pk>d+)/$', PostDetail.as_view(), n
ame='post_detail'),
)

37
Class Based Views
Контроллер-функция (пример 2)
def post_list(request):
paginator = Paginator(Post.objects.all(), 25)

page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
return render(
request, 'blog/post_list.html',
{'object_list': posts}
)
38
Class Based Views
Контроллер-класс (пример 2)
class PostList(generic.ListView):
model = Post
paginate_by = 25

39
Class Based Views
Контроллер-функция (пример 3)
@login_required
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
})

40
Class Based Views
Контроллер-класс (пример 3)
class CategoryListView(generic.ListView):
template_name = 'blog/category.html’
def get_queryset(self):
self.cat =
get_object_or_404(Category, pk=self.kwargs['pk'])
return Post.objects.filter(category=self.cat)
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return
super(CategoryListView, self).dispatch(*args, **kwargs)
def get_context_data(self, **kwargs):
context =
super(CategoryListView, self).get_context_data(**kwargs)
context['category'] = self.cat
return context

41
Class Based Views

42
Фильтры и теги в
шаблонизаторе

43
Построение урлов
Модель
class Post(models.Model):
…
@models.permalink
def get_absolute_url(self):
return ('post_detail', (self.pk,))
# либо
def get_absolute_url(self):
return
reverse('post_detail', args=(self.pk,))

44
Построение урлов
Роутинг
url(r'^(?P<pk>d+)/$', 'post_detail', name='post_de
tail'),

Шаблоны
<a href="{{ post.get_absolute_url }}">{{ post
}}</a>
<a href="{% url 'post_detail' post.pk %}">{{ post
}}</a>

45
Фильтры и теги в шаблонизаторе
 Фильтр
{{ post.content|cut:"<cut>" }}
 Simple Tag
{% current_time "%Y-%m-%d %I:%M %p" %}
 Inclusion tag
{% popular_tags 20 %}

46
Фильтры и теги в шаблонизаторе
 Assignment tags
{% get_current_time "%Y-%m-%d %I:%M %p" as
the_time %}
 Блок с закрывающим тегом

{% switch %} {% endswitch %}

47
Фильтры и теги в шаблонизаторе
Добавление тега
blog/
__init__.py
models.py
templatetags/
__init__.py
blog_tags.py
tests.py
views.py

48
Фильтры и теги в шаблонизаторе
from django import template
from blog.models import Post
register = template.Library()
@register.inclusion_tag('blog/tags/lastposts.html')
def last_posts():
return {'post_list': Post.objects.all()[:5]}

49
Фильтры и теги в шаблонизаторе
Шаблон
<ul>
{% for object in post_list %}
<li><a href="{{ object.get_absolute_url}}">{{
object }}</a></li>
{% endfor %}
</ul>

Подключение
{% load blog_tags %}
{% last_posts %}

https://docs.djangoproject.com/en/dev/howto/custom-templatetags/
50
Приложения из коробки

51
Административная консоль
Подключение
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
…
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)

52
Административная консоль
Подключение
from blog.models import Category, Post
from django.contrib import admin
class PostAdmin(admin.ModelAdmin):
date_hierarchy = 'creation_date'
list_display = ('title', 'category')
list_filter = ('category',)
search_fields = ('title',)
admin.site.register(Category)
admin.site.register(Post, PostAdmin)

53
Административная консоль

54
Административная консоль

55
Административная консоль

56
Static Files
Возможности
 Сбор статики

 Отдача статики (???)
 Шаблонные теги

Сбор статики
STATIC_ROOT = "/var/www/blog.me/static/"

python manage.py collectstatic
57
ContentTypes framework
Article
id
title
…

Photo
id
title
…
TaggedItem
id
content_type_id
object_id
tag_id

Tag
id
title
…
58
Оптимизация

производительности

59
Кеширование
Схема кеширования








60
Кеширование
Условия кеширования

61
Кеширование
Поддержка

62
Кеширование
Уровни кеширования

63
•
•
•

64
•
•
•

•

•

65
Полезные советы
 Избегайте дублирования кода DRY
 Делайте короче и проще KISS

66
1. Авторизация и регистрация пользователей на сайте
2. Блок с последними зарегистрированными
пользователями
http://tp.mail.ru/blog/Web/935.html

67
Спасибо за внимание
Александр
Бекбулатов, a.bekbulatov@c
orp.mail.ru

More Related Content

Web осень 2013 лекция 8