Введение в Django

5,038 views
4,935 views

Published on

Презентация django в студии Future Colors 30.04.2010

Published in: Education

Введение в Django

  1. 1. Введение в django
  2. 2. django - это python <ul><li>Django </li></ul><ul><ul><li>Версия 1.1.1 (BSD) </li></ul></ul><ul><ul><li>  Проект был опубликован в 2005 г.  Python 2.3 и выше </li></ul></ul><ul><li>  </li></ul><ul><li>СУБД PostgreSQL, MySQL, SQLite и Oracle.  </li></ul><ul><li>  </li></ul><ul><li>Google App Engine </li></ul>
  3. 3. Сильные стороны django <ul><ul><li>ORM </li></ul></ul><ul><ul><li>Автоматически генерируемая админка </li></ul></ul><ul><ul><li>Очень красивые URL </li></ul></ul><ul><ul><li>Шаблонная система </li></ul></ul><ul><ul><li>Кеширование, интернационализация, аутентификация и другие приложения - большая коробка </li></ul></ul><ul><ul><li>Встроенный веб-сервер и система развёртывания </li></ul></ul>
  4. 4. Структура проекта django
  5. 5. Создание проекта и  его приложений с помощью консольных утилит <ul><li>Создание проекта </li></ul><ul><ul><li>django-admin.py startproject myproject </li></ul></ul><ul><li>Создание приложения </li></ul><ul><ul><li>cd myproject  </li></ul></ul><ul><ul><li>python manage.py startapp myapp </li></ul></ul><ul><li>Синхронизация моделей и БД </li></ul><ul><ul><li>python manage.py syncdb </li></ul></ul><ul><li>Запуск встроенного сервера </li></ul><ul><ul><li>python manage.py runserver   </li></ul></ul><ul><li>  </li></ul><ul><li>... и многие другие операции </li></ul><ul><li>  </li></ul><ul><li>  </li></ul>
  6. 6. Структура директорий проекта <ul><li>myproject/ </li></ul><ul><ul><ul><ul><li>myapp1/ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>__init__.py models.py tests.py views.py </li></ul></ul></ul></ul><ul><ul><ul><ul><li>myapp2/ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>__init__.py models.py tests.py views.py </li></ul></ul></ul></ul><ul><ul><ul><ul><li>__init__.py </li></ul></ul></ul></ul><ul><ul><ul><ul><li>manage.py settings.py urls.py </li></ul></ul></ul></ul>
  7. 7. MVT против MVC <ul><li>M odel </li></ul><ul><li>  </li></ul><ul><li>V iew </li></ul><ul><li>  </li></ul><ul><li>C ontroller </li></ul><ul><li>M odel </li></ul><ul><li>  </li></ul><ul><li>T emplate </li></ul><ul><li>  </li></ul><ul><li>V iew </li></ul><ul><li>Urls </li></ul>
  8. 8. Модели
  9. 9. Пример модели <ul><li>from django.db import models class Person(models.Model): </li></ul><ul><ul><li>first_name = models.CharField('Имя', max_length=30) last_name = models.CharField('Фамилия', max_length=30)  </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>def __unicode__(self): </li></ul></ul><ul><ul><li>return self.name </li></ul></ul><ul><ul><li>class Meta: </li></ul></ul><ul><ul><li>ordering = [&quot;-id&quot;] verbose_name_plural = &quot;Человеки&quot; </li></ul></ul>
  10. 10. Возможности ORM <ul><li>Набор типов полей </li></ul><ul><ul><li>Строки, email, xml, числа, даты, файлы и др. </li></ul></ul><ul><li>Отношения между моделями </li></ul><ul><ul><li>org = models.ForeignKey(Org) </li></ul></ul><ul><ul><li>assigned_tickets = models.ManyToManyField(Ticket) </li></ul></ul><ul><li>Абстрактные модели и наследование </li></ul><ul><li>Мета-параметры  </li></ul><ul><ul><li>permissions = ((&quot;can_delete&quot;, &quot;Удаление&quot;),) </li></ul></ul>
  11. 11. QuerySet и работа с ним в примерах <ul><li>User.objects.all() </li></ul><ul><li>Org.objects.filter(members__name__endwith=' слав ') </li></ul><ul><li>Post.objects.filter(title__startswith=' Как ')                   .exclude(pub_date__gte=datetime.now())                   .filter(pub_date__gte=datetime( 2010 , 1 , 1 )) </li></ul><ul><li>Entry.objects.all().order_by(' title ')[ 5 : 10 ] ~ OFFSET 5 LIMIT 5 </li></ul><ul><li>  </li></ul><ul><li>Post.objects.get(     Q(title__startswith=' Почему '),     Q(pub_date=date( 2010 , 1 , 1 ))  |  Q(pub_date=date( 2010 , 5 , 6 )) ) </li></ul>
  12. 12. Работа с моделями <ul><li>Добавление </li></ul><ul><ul><li>p = Person(first_name=&quot;Иван&quot;, last_name=&quot;Иванов&quot;) p.save() </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><li>Выборка связанных </li></ul><ul><ul><li>beatles.members.all() ringo.group_set.all() </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><li>Автоматическое связывание </li></ul><ul><ul><li>сравните: </li></ul></ul><ul><ul><li>e = Post.objects.get(id=5) </li></ul></ul><ul><ul><li>print e.author и </li></ul></ul><ul><ul><li>e = Post.objects.select_related().get(id=5) </li></ul></ul><ul><ul><li>print e.author </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><li>Свои менеджеры </li></ul>
  13. 13. Автоматическая админка <ul><li>class Event (models.Model):     what   = models.CharField('Что', max_length=150)     where  = models.CharField('Где', max_length=150)     when   = models.DateField('Когда')     descr  = models.TextField('Описание', blank=True, null=True)     show   = models.BooleanField('Показывать в общедоступном списке')     public = models.BooleanField('Опубликовано')     date   = models.DateTimeField('Время создания', auto_now_add=True)     image  = ThumbnailImageField('Изображение', upload_to='uploads', blank=True, null=True)     url    = models.CharField('Код', max_length=100, editable=False)     class Meta:         ordering = ['-date']         verbose_name = 'Анонс мероприятия'         verbose_name_plural = 'Анонсы мероприятия' </li></ul><ul><li>def hideEvents (modeladmin, request, queryset):     queryset.update(show=False) hideEvents.short_description = u'Снять с публикации' </li></ul><ul><li>class EventAdmin (admin.ModelAdmin):     list_display = ('what', 'where', 'when', 'url', 'show', 'public', 'date')     search_fields = ('what', 'where', 'descr')     list_filter   = ('date', 'show', 'public')     actions = [hideEvents] admin.site.register( Event , EventAdmin ) </li></ul>
  14. 15. Шаблоны
  15. 16. Особенности шаблонов django <ul><ul><li>Никакого питона ;-)) </li></ul></ul><ul><ul><li>Система наследования шаблонов </li></ul></ul><ul><ul><li>Блоки, переопределение блоков </li></ul></ul><ul><ul><li>Фильтры  </li></ul></ul><ul><li>  </li></ul><ul><li>Пример: </li></ul><ul><ul><ul><ul><li><html> <head>     <link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; />     <title> {% block title %} Мой сайтик {% endblock %} </title> </head> <body>     <div id=&quot;sidebar&quot;>         {% block sidebar %}         <ul>             <li><a href=&quot;/&quot;>Главная</a></li>             <li><a href=&quot;/blog/&quot;>Блог</a></li>         </ul>         {% endblock %}     </div>     <div id=&quot;content&quot;>         {% block content %}{% endblock %}     </div> </body> </html> </li></ul></ul></ul></ul>
  16. 17. ...продолжение <ul><ul><ul><ul><li>{% extends &quot;base.html&quot; %} </li></ul></ul></ul></ul><ul><ul><ul><ul><li>{% load image_helper %} {% block title %} Блог моего замечательного сайта {% endblock %} {% block content %} {% for entry in blog_entries %} </li></ul></ul></ul></ul><ul><ul><ul><ul><li>     <div class=&quot; {% cycle 'even_row' 'odd_row' %} &quot;>          <h2> {{ entry.title|upper|safe }} </h2>          <p> {{ entry.body }} </p> </li></ul></ul></ul></ul><ul><ul><ul><ul><li>         <div class=&quot;author&quot;> {{ entry.author.name|default: 'аноним' }} </div> </li></ul></ul></ul></ul><ul><ul><ul><ul><li>         <div class=&quot;author&quot;> {% related_images entry.tags %} </div> </li></ul></ul></ul></ul><ul><ul><ul><ul><li>     </div> {% endfor %} {% endblock %} </li></ul></ul></ul></ul>
  17. 18. Пишем свои теги и фильтры <ul><li>@register.filter(name='cut') @stringfilter def cut(value, arg):     return value.replace(arg, '') @register.inclusion_tag('results.html') def show_results(poll):     return {'poll_set': Poll.get_stat()} </li></ul>
  18. 19. Виды
  19. 20. URL-отображения <ul><li>Пример: </li></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>from django.conf.urls.defaults import * from django.views.generic import list_detail from django.views.generic.simple import redirect_to, direct_to_template from django.contrib import admin from myproject.myapp.views import entries, post from myproject.myapp.models import User urlpatterns = patterns('',     # админка     (r'^admin$', redirect_to, { 'url': 'admin/' }),     (r'^admin/', include(admin.site.urls)),     # блог     (r'^blog/$', entries),     (r'^blog/(?P<id>d+)/$', post),     # статика     ('^about/$', direct_to_template, {'template': 'about.html'})     # пользователи     (r'^users/$', list_detail.object_list, {'queryset': User.objects.all()}) ) </li></ul></ul>
  20. 21. Функции видов <ul><li>Пример: </li></ul><ul><li>  </li></ul><ul><li>from django.http import Http404 </li></ul><ul><li>from myproject.myapp.models import User def detail(request, user_id):     try:         u = User.objects.get(pk=user_id)     except User.DoesNotExist:         raise Http404     return render_to_response('users/detail.html', {'user': u}) </li></ul>
  21. 22. Функции видов <ul><li>Варианты ответов: </li></ul><ul><li>  </li></ul><ul><li>return HttpResponse('<html><body>Привет всем!</body></html>') </li></ul><ul><li>return HttpResponse(status=403) </li></ul><ul><li>  </li></ul><ul><li>return redirect(object)   # с использованием get_absolute_url() </li></ul><ul><li>my_object = get_object_or_404(MyModel, pk=1) </li></ul><ul><li>&quot;Тяжёлое&quot; взаимодействие с шаблонами   </li></ul><ul><li>t = loader.get_template('myapp/template.html') c = Context({'foo': 'bar'}) return HttpResponse(t.render(c), mimetype=&quot;application/xhtml+xml&quot;) </li></ul>
  22. 23. Формы
  23. 24. Формы в django <ul><li>Конструирование формы: </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>from django import forms class ContactForm(forms.Form):     subj = forms.CharField (max_length=100)     message = forms.CharField()     sender = forms.EmailField() </li></ul><ul><li>Работа с формой: </li></ul><ul><li>form = ContactForm(request.POST) if form.is_valid(): </li></ul><ul><li>    data = form.cleaned_data </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>       </li></ul><ul><li>Форма из модели </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>from django.forms import ModelForm from myproject.myapp.models import Article class ArticleForm(ModelForm):     class Meta:         model = Article </li></ul><ul><li>Вывод формы: </li></ul><ul><li>{{ form }} {{ form.as_table }} {{ form.as_ul }} {{ form.as_p }} </li></ul>
  24. 25. Дополнительные возможности
  25. 26. Аутентификация <ul><li>Встроена работа с пользователями </li></ul><ul><li>  </li></ul><ul><li>request.user.is_authenticated() </li></ul><ul><li>  </li></ul><ul><li>logout(request) </li></ul><ul><li>@login_required def my_view(request):     # ... </li></ul><ul><li>(r'^accounts/login/$', 'django.contrib.auth.views.login'), </li></ul><ul><li>@user_passes_test(lambda u: u.has_perm('polls.can_vote')) def my_view(request):     # ... </li></ul>
  26. 27. Кеширование <ul><li>Настройка кеша... </li></ul><ul><ul><li>CACHE_BACKEND = 'memcached://127.0.0.1:11211/' CACHE_BACKEND = 'db://my_cache_table' </li></ul></ul><ul><li>...и его использование </li></ul><ul><ul><li>@cache_page(60 * 15) def my_view(request):     pass </li></ul></ul><ul><ul><li>@cache_control(must_revalidate=True, max_age=3600) </li></ul></ul><ul><ul><li>@never_cache </li></ul></ul><ul><ul><li>{% load cache %} {% cache 500 sidebar %}     тут наш sidebar {% endcache %} </li></ul></ul><ul><ul><li>cache.set('a', 1) / .get('a') / .delete('a') </li></ul></ul>
  27. 28. <ul><li>Сессии Отправка e-mail </li></ul><ul><ul><li>send_mail('Тема', 'Сообщение.', 'from@example.com',                   ['to@example.com'], fail_silently=False) </li></ul></ul><ul><li>Компонент flatpages Локализация (даты, админка...) Пагинация </li></ul><ul><ul><li>p = Paginator(objects, 10) </li></ul></ul><ul><li>Sitemap на основе get_absolute_url() Генерация RSS Поддержка JSON </li></ul><ul><ul><li>response.write(serializers.serialize('json', object)) </li></ul></ul>
  28. 29. the end

×