2. План лекции
1. Скрипт управления django приложением.
2. Middleware.
3. Использование сессий.
4. Приложение auth.
5. Class Based Views.
6. Расширение фильтров и тэгов в
шаблонизаторе.
7. Другие приложения из коробки.
8. Оптимизация производительности
2
5. Ручная инициализация
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
7. 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
8. Управление 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
13. CSRF в Django
• «Небезопасные» методы POST, PUT и DELETE
• Установка cookie (csrftoken)
• Установка hidden поля (csrfmiddlewaretoken)
или заголовка (X-CSRFToken)
13
14. CSRF в Django
1. Для установки куки страница должна отдаваться
динамически
2. Кука может не ставиться, если передача контекста
идет через Context вместо RequestContext
3. Скрытое поле ставится тегом {% csrf_token
%}, используйте RequestContext (функция render)
4. Токен в ajax запросах удобнее передавать заголовком
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
14
28. 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
30. 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
31. Django Auth
Проверка авторизации в шаблонах
{% if user.is_authenticated %}
Welcome, {{ user.username }}
{% else %}
Please log in.
{% endif %}
31
32. 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
33. Django Auth
Расширение текущего пользователя
• Другой уникальный ключ пользователя (email вместо
username)
• Дополнительные поля (в т. ч. обязательные)
https://docs.djangoproject.com/en/dev/topics/auth/customizing
/#extending-the-existing-user-model
33
37. 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
46. Фильтры и теги в шаблонизаторе
Фильтр
{{ post.content|cut:"<cut>" }}
Simple Tag
{% current_time "%Y-%m-%d %I:%M %p" %}
Inclusion tag
{% popular_tags 20 %}
46
47. Фильтры и теги в шаблонизаторе
Assignment tags
{% get_current_time "%Y-%m-%d %I:%M %p" as
the_time %}
Блок с закрывающим тегом
{% switch %} {% endswitch %}
47
48. Фильтры и теги в шаблонизаторе
Добавление тега
blog/
__init__.py
models.py
templatetags/
__init__.py
blog_tags.py
tests.py
views.py
48
49. Фильтры и теги в шаблонизаторе
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
50. Фильтры и теги в шаблонизаторе
Шаблон
<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
52. Административная консоль
Подключение
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
53. Административная консоль
Подключение
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