Введение в Django

Расширяя Django

Показывать лекцию целиком

Цель лекции: Рассмотреть принцип создания пользовательских шаблонов тегов и фильтров, ознакомиться с общими представлениями на основе классов, ознакомиться с вложенными подфреймворками и их основными параметрами.

Ключевые термины: django, фильтр, фреймворк, тег, сообщение, шаблон, модель, пользователь, система, форма, представление, данные, приложение, url, строка

Для вас это было долгое путешествие, и мы поработали со множеством кода и основными концепциями, относящимися к функциональности Django. В этой лекции мы обсудим Django немного больше, если сказать вкратце, различные параметры, такие как настраиваемые теги, фильтры, структуры, системы сообщений и так далее.

Пользовательские шаблоны тегов и фильтры

Система шаблонов Django поставляется с множеством шаблонов тегов и фильтрами, которые делают написание шаблонов легкой и гибкой работой. Иногда, вы, возможно, захотите расширить систему шаблонов собственными тегами и фильтрами. Это обычно происходит, когда вы находите повторяющуюся структуру одного и того же тега множество раз, когда вы хотите обернуть структуру в единый тег, или даже тогда, когда у вас есть фильтр, который вы хотите добавить в систему шаблонов.

Угадайте, что? Django уже позволяет вам сделать это, и это довольно легко! Вы в основном добавите новый пакет к вашему приложению, назовете его templatetags и положите модули, которые содержат теги и фильтры в него. Давайте узнаем об этом, добавив фильтр, который использует строку. Добавим каталог templatetags в родительский каталог mytweets и положим пустой файл под названием_ init_.py туда, так чтобы Python рассматривал каталог как пакет. Теперь создайте модуль под названием mytweet_filters в нем. Мы собираемся написать наш фильтр в этом модуле Вот пример структуры каталога:

templatetags /
|--init .py
|--mytweet_filters.py

Теперь добавьте следующий код к файлу mytweet_filters.py:

from django import template 
register = template.Library()
©register.filter def capitalize(value):
return value.capitalize()

Переменная register является объектом, который может использоваться для введения новых тегов и фильтров в систему шаблонов. Здесь мы использовали декоратор register.filter для добавления функции смены прописных букв в качестве фильтра.

Чтобы использовать новый фильтр из внутри шаблона, добавьте следующую строку в начало вашего файла шаблона:

{% load mytweet_filters %}

Затем можно использовать новый фильтр так же, как любой другой фильтр, предлагаемый Django:

Hi {{ name|capitalize }}!

Добавление пользовательского шаблона тегов работает аналогично с фильтрами. В основном, вы определяете методы для обработки тегов и затем регистрируете тег, чтобы сделать его доступным для шаблонов. Этот процесс немного сложнее, потому что теги могут быть более сложными, чем фильтры. Дополнительную информацию о пользовательских шаблонах тегов доступны в документации по Django

При написании пользовательского фильтра, вы должны заботиться о поведении авто-исключения Django с фильтром. Существует три типа строк, которые могут быть переданы в фильтр:

  • Raw String : строка подготовленная либо командой str или сформированная из символов Unicode. Они автоматически исключаются, если включено автоматическое исключение.
  • Safe strings: эти строки являются строками, которые помечены от дальнейшего исключения. Они не нуждаются в каких-либо дальнейших исключениях. Чтобы пометить вывод как безопаснцю строку, используйте модуль django.utils.safestring.mark_safe().
  • Строки помеченные как "нуждающиеся в исключении": как и предполагает название, их всегда нужно избегать
  • Общие представления на основе классов

    Во время работы с Django, вы заметите, что существуют определенные типы представлений, которые всегда необходимы независимо от проекта, над которым вы работаете. По этой причине Django поставляется с набором представлений, которые можно использовать в любом проекте. Эти представления называются общие представления.

    Django предоставляет общие представления для следующих целей:

  • Для создания простых представлений для таких задач, как перенаправление на другой URL-адрес или отображение шаблона.
  • Просмотр и формирование представлений для отображения объектов из модели данных – эти представления аналогичны тому, как страница администратора отображает списки и страницы сведений для данных моделей
  • Для создания страниц на основе даты архива; Это может быть особенно полезно для блогов
  • Для создания, редактирования и удаления объектов в модели данных
  • Представления Django на основе классов можно настроить путем определения подклассов, или путем передачи аргументов непосредственно в URL-адрес conf.

    Подклассы полны соглашений, которые устраняют хлопоты, связанные, чтобы переписать шаблоны в самых распространенных ситуациях. Когда вы используете подкласс можно переопределить атрибут или методы основного класса, подставив новое значение:

    #app_name/views.py
    from django.views.generic import TemplateView
    class ContactView(TemplateView): 
    template_name = "contact.html"
    

    Мы также добавим эту запись в файл urls.py, чтобы получить перенаправление:

    project/urls.py
    from django.conf.urls.defaults import * 
    from some_app.views import ContactView
    urlpattems = patterns ('
    (r''connect/', ContactView.as_view()),
    )
    

    Интересно, что мы можем достичь того же самого, изменив файл и добавив несколько строк в файл urls.py:

    from django.conf.urls.defaults import *
     from django.views.generic import TemplateView
    urlpattems = patterns('',
    (ur1'contact/', TemplateView.as_view (template_name="contact.html") ) ,
    )
    

    Вложенные подфреймворки

    Пакет Django.contrib содержит стандартную библиотеку Django. Мы использовали следующие подфреймворки из этого пакета в предыдущих главах этой книги:

  • admin: это интерфейс администратора Django
  • auth: это система аутентификации пользователей
  • sessions: это фреймворк сессии Django
  • sindication: это фреймворк генерации фидов
  • Эти вложенные фреймворки очень упрощают нашу работу, независимо от того, создаем ли мы регистрацию и проверки подлинности, создаем страницу администрирования или предоставляем фиды для нашего содержимого. Пакет Django.contrib является очень важной частью Django. Знание его подпакетов и того, как их использовать, сэкономит вам много времени и усилий.

    Этот раздел предоставит вам краткое введение в другие фреймворки в данном пакете. Не буду вдаваться в подробности о том, как пользоваться каждым фреймворком, но вы узнаете достаточно, чтобы знать, когда использовать фреймворк. После того, как вы захотите использовать фреймворки в проекте, вы можете прочитать онлайн-документацию, чтобы узнать больше о нем.

    Flatpages

    Веб-приложения могут содержать страницы, которые являются статическими по природе. Например, ваш сайт может включать набор страниц справки, которые редко изменяются. Django предоставляет приложение под названием flatpages для обслуживания статических страниц. Приложение является довольно простым; оно предоставляет вам модель данных для хранения различных битов информации о каждой странице, включая следующие:

  • URL-адрес
  • Название
  • Содержимое
  • Имя шаблона
  • Требуется ли регистрация для просмотра страницы
  • Чтобы использовать приложение, можно просто включить его в переменную INSTALLED_APPS в файле settings.py его middleware в переменную MIDDLEWARE_CLASSES. После этого можно хранить и управлять статическими страницами с помощью модели данных, предоставленной приложением flatpages.

    HUMANIZE

    Приложение humanize предлагает набор фильтров для добавления прикосновения человека к вашим страницам. Вот список доступных фильтров:

  • apnumber: для цифр 1-9, возвращает число прописью. В противном случае она возвращает само число. Другими словами, 1 становится "один", 9 становится "девять" и так далее, тогда как 10 остается 10.
  • intcomma: Принимает целое число и преобразует его в строку с запятой, например:

    4500 становится 4500.

    45000 становится 45,000.

    450000 становится 450,000.

    4500000 становится 4,500,000.

  • intword: Преобразует целое в легкую для чтения форму, например:

    1000000 становится 1,0 млн.

    1200000 становится 1,2 млн.

    1200000000 становится 1,2 млрд.

  • naturalday: основанный на диапазоне дат, выдает данную дату в диапазоне (+ 1, 0, -1), это отображает дату как "завтра", "сегодня" и "вчера", соответственно, к примеру, (если сегодня 26 января 2007 г.):

    25 Янв 2007 вчера.

    26 Янв 2007 сегодня

    27 Янв 2007 завтра

  • naturaltime: Возвращает строку, представляющую, сколько секунд, минут или часов назад от даты произошло событие, например, а (если сейчас 26 января, 2007 16:30:00):

    26 Jan 2007 16:30:00 сейчас.

    26 Jan 2007 16:29:31 29 seconds ago.

    26 Jan 2007 16:29:31 29 seconds ago.

    26 Jan 2007 16:25:35 4 минуты назад

    26 Jan 2007 15:30:29 59 минут назад

    26 Jan 2007 15:30:01 59 минут назад

    26 Jan 2007 15:30:00 1 час назад

    26 Jan 2007 13:31:29 2 часа назад

    25 Jan 2007 13:31:29 1 день, 2 часа назад

    25 Jan 2007 13:30:01 1 день, 2 часа назад

    25 Jan 2007 13:30:00 1 день, 3 часа назад

    26 Jan 2007 16:30:30 будет через 30 секунд

    26 Jan 2007 16:30:29 будет через 30 секунд

    26 Jan 2007 16:31:00 будет через 1 минуту

    26 Jan 2007 16:34:35 будет через 4 минуты

    26 Jan 2007 17:30:29 будет через 1 час

    26 Jan 2007 18 : 31:29 будет через 2 часа

    27 Jan 2007 16 : 31:29 будет через 1 день

  • ordinal: Преобразует целое в его порядковую форму, 1 становится "1й", и так далее между после каждых трех разрядов.
  • Sitemap

    Sitemap — это фреймворк для создания карты сайтов, являющихся XML-файлами, которые помогают индексаторам поисковых движков находить динамические страницы на вашем сайте. Он указывает индексатору насколько страница важна и как часто она меняется. Эта информация делает процесс индексирования более точным и эффективным.

    Фреймворк sitemaps позволяет выразить предыдущую информацию в коде Python , а затем генерирует XML-документ, который представляет карту вашего сайта. Это охватывает все наиболее часто используемые фреймворки из пакета django contrib. В пакете содержатся дополнительные приложения, которые не так важны, как предыдущие и он время от времени обновляется с новыми приложениями. Для того, чтобы узнать о любом приложения из пакета django contrib, вы можете всегда прочитать его документацию, которая доступна онлайн.

    Защита от поддельного межсайтового запроса

    Мы обсуждали способы предотвращения двух типов веб-атак в лекции 5а именно, SQL инъекций и межсайтовых сценариев. Django обеспечивает защиту от атак, называется поддельный межсайтовый запрос. В этой атаке вредоносный сайт пытается манипулировать вашим приложением, обманывая пользователя, который вошел в систему на вашем сайте, чтобы открыть специально созданную страницу. Эта страница обычно содержит код JavaScript, который пытается отправить форму на ваш сайт. CSRF защита работает путем встраивания токена (это секретный код) во все формы и проверяет токен при отправке формы. Это делает фактически неосуществимым CSRF-атаки. Чтобы активировать защиту от CSRF, вам просто нужно добавить параметр 'django.contrib.csrf.middleware.CsrfMiddleware' в переменную MIDDLEWARE_CLASSES и это будет работать, прозрачно, для предотвращения CSRF-атак.

    Система сообщений

    Наше приложение позволяет пользователям добавлять друг друга как друзей и отслеживать закладки друг друга. Хотя эти две формы коммуникации, связаны с природой нашего приложения для закладок, иногда пользователи хотят иметь гибкость отправки личных сообщений друг другу. Эта функция особенно полезна для укрепления социального аспекта нашего веб-сайта.

    Система сообщений может осуществляться различными путями. Это может быть так же просто, как предоставление каждому пользователю контактную форму, которая работает, посылая его содержание на электронную почту пользователя при отправке сообщения.У вас уже есть вся информация, необходимая для создания компонентов данной функциональности:

  • Форма сообщения с текстовым полем для темы и текстовая области для тела сообщения
  • Представление, которое отображает форму сообщения пользователя и посылает его содержание через функцию send_mail()
  • Когда вы разрешаете пользователю отправлять электронную почту через ваш сайт, вам нужно быть осторожным во избежание злоупотребления этой функцией. Здесь вы можете ограничить контактные формы только для зарегистрированных пользователей или только для друзей.

    Другой подход к реализации системы сообщений осуществляется с помощью хранения и управления сообщениями в базе данных. Таким образом, пользователи могут отправлять и просматривать сообщения, с помощью самого нашего приложения вместо использования электронной почты. Хотя этот подход более привязан к нашему приложению, и тем самым он держит пользователей на нашем веб-сайте, он включает в себя больше работы над имплементацией. Однако как и в случае предыдущего подхода, вас уже есть все сведения, необходимые и для имплементации этого подхода. Здесь необходимы следующие компоненты:

  • Модель данных для хранения сообщений. Она должна содержать поля отправитель, получатель, тема и тело. Вы также можете добавить поля для даты, чтения статуса и так далее.
  • Форма для создания сообщений. Необходимы поля тело сообщения и тема.
  • Представление списка доступных сообщений.
  • Представление отображения сообщения.
  • Предыдущий список является лишь одним способом, который используется для имплементации системы сообщений. Можно, например, соединять представления списка и сообщения в одно представление или отображать посланные сообщения вместе с полученными. Возможности многочисленны и зависят от того, насколько продвинутую систему вы хотите получить.

    Система подписки

    Мы предлагаем несколько веб-фидов, которые позволяют пользователям следить за обновлениями на нашем сайте. Однако некоторые пользователи могут по-прежнему предпочитают старый способ мониторинга обновлений по электронной почте. Для этих пользователей вы можете имплементировать систему подписки по электронной почте к приложению. Например можно позволить пользователям получать уведомления, когда друг опубликовал закладку, или когда закладка размещена под определенного тегом.

    Кроме того можно сгруппировать такие уведомления и отправить пакетно, чтобы избежать отправки большого количества сообщений электронной почты. Детали имплементации этой функции во многом зависят от того, как вы хотите, чтобы это работало. Это может быть как простая модель данных, которая хранит теги, на которые каждый пользователь подписывается. Она будет иметь цикл, который перебирает всех пользователей, которые являются подписчиками определенного тега и отправляет уведомления для них, когда закладка размещена под этим тегом. Этот подход, однако, слишком простой и генерирует много электронных писем. Более сложный подход может включать хранение уведомления в модели данных и отправление их на один адрес электронной почты ежедневно.

    Оценки пользователя

    Некоторые веб-сайты (такие как Slashdot.org и reddit.com) измеряют активность пользователей путем присвоения баллов для каждого пользователя. Эта оценка увеличивается всякий раз, когда пользователь вносит вклад в сайт различным путем. Оценки пользователей могут быть использованы различными способами. Например, можно выпустить новые возможности для наиболее активных пользователей сначала или обеспечить другие преимущества для активных пользователей, которые будут мотивировать других пользователей вносить больший вклад для вашего веб-сайта.

    Имплементировать оценку пользователя довольно просто. Вам нужна модель данных для сохранения результатов в базе данных. После этого можно использовать API модель Django для доступа и управления оценкой в пределах представления.

    Контрольные вопросы

  • Для чего требуется создавать карту сайта?
  • Какие цели преследуются при использовании общих представлений на основе классов?
  • От каких атак Django обеспечивает защиту?
  • Для чего нужна оценка пользователя?
  • Что такое вложенные под-фреймворки?
  • Упражнения

    Упражнение 1.

    Реализовать карту сайта в проекте

    Упражнение 2.

    Создайте систему подписки

    Упражнение 3.

    Реализуйте оценивание твитов пользователями

    Упражнение 4.

    Создать систему сообщений для прокета

    Список курсовых работ

  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа системы модерации твитов
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа системы регистрации пользователей
  • Разработка комплекта пользовательских фильтров и шаблонов для продвинутой системы комментирования
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа системы ведения пользовательских блогов
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса мгновенного обмена собщениями
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа веб-сервиса для хранения изображений
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа веб-сервиса электронной почты
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса для ведения списка ежедневных дел
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса для учета рабочего времени
  • Разработка комплекта пользовательских фильтров и шаблонов для приложения для твитов
  • Краткие итоги

  • рассмотреть принцип создания пользовательских шаблонов тегов
  • рассмотреть принцип создания пользовательских фильтров
  • ознакомиться с общими представлениями на основе классов
  • ознакомиться с целями использования общих представлений на основе классов
  • ознакомиться с вложенными под-фреймворками и их основными параметрами
  • рассмотреть принципы создания оценок пользователя
  • рассмотреть защиту от межузловых запросов
  • ознакомиться с системой сообщений
  • ознакомиться с системой подписки
  • ознакомиться с подфреймворком для создания карты сайтов
  • Вернуться к учебному плану