Российский Новый Университет
Опубликован: 25.01.2016 | Доступ: свободный | Студентов: 2234 / 161 | Длительность: 16:40:00
Лекция 9:

Расширение и развертывание

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Создание файлов перевода

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

Создадим файл перевода. Во-первых вам нужно найти файл с именем make-messages py в каталоге bin внутри каталога установки Django. Самый простой способ найти его — с помощью функции поиска вашей операционной системы. После того как вы найдете его, скопируйте его в ваш системный путь (/usr/bin/ в Linux и Mac OS X и C:\windows\ в Windows ).

Кроме того убедитесь, что это исполняемый файл, выполнив следующую команду в Linux и Mac OS X (этот шаг не требуется для пользователей Windows):

sudo chmod + x /usr/bin/make-messages.py

Утилита make-messages py использует пакет программного обеспечения под названием GNU gettext для извлечения переводимых строк из исходного кода.Т аким образом вам нужно установить этот пакет.

Для Linux найдите пакет в ваш менеджере пакетов и установите его. Пользователи Windows могут найти установщик пакета на http: //gnuwin32.sourcef orge.NET/packages/gettext.htm.

Наконец, пользователи Mac OS X могут найти версию пакета для их операционной системы, а также инструкции по установке на http://gettext.DarwinPorts.com.

Как только у вас установлен пакет GNU gettext, откройте терминал, перейдите в папку проекта, создайте там каталог locale , а затем запустите следующую команду:

make-messages.py -1 de

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

После выполнения предыдущей команды, она создаст файл с названием django.po в locale/de/LC_MESSAGES /. Это файл перевода для немецкого языка. Откройте его в текстовом редакторе, чтобы увидеть, как он выглядит. Файл начинается с некоторых метаданных, таких как дата создания и набор символов. После этого вы найдете запись для каждой переводимой строки. Каждая запись состоит из имени файла, номера строки, самой строки и пустой строки под ней, где должен быть перевод.Вот пример записи из файла:

#: user_profile/forms.py 
msgid "Friend's Name" 
msgstr ""

Чтобы перевести строку, просто используйте свой текстовый редактор, чтобы набрать перевод в пустой строке в третьей строке. Можно также использовать редактор специализированного перевода, например Poedit (доступен для всех основных операционных систем на http //www.poedit.net/), но для нашего простого файла, должно быть достаточно обычного редактора текста.Убедитесь, что вы установили допустимый символ в разделе метаданных файла.Я рекомендую вам использовать UTF-8:

"Content-Type: text/plain; charset=UTF-8\n"

Вы можете отметить, что перевод файла содержит несколько строк интерфейса администрирования. Это потому, что шаблон администратора admin/base_site.html использует тег шаблона trans для обозначения строки как переводимой. Эти строки не нужно переводить; Django уже поставляется с переводом файлов для них.

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

Далее, выполните следующую команду в каталоге вашего проекта:

compile-messages.py

Если утилита жалуется на ошибку в файле (например, отсутствует знак кавычек), исправьте ошибку и попробуйте еще раз. После того, как все завершилось успешно, утилита создаст скомпилированный перевод в файле django.mo в том же каталоге и все будет установлено для следующего шага в данном разделе.

Включение и настройка системы i18n

Django поставляется с системой il8n, она по умолчанию включена. Это можно проверить путем поиска строки в файле settings.py:

USE_I18N = True

Существует два способа настройки системы il8n.Можно установить язык глобально для всех пользователей или позволить пользователям указывать предпочитаемые ими языки индивидуально.

Мы увидим, как сделать оба этих варианта в этом подразделе.

Чтобы задать активный язык глобально, найдите в файле settings.py переменную LANGUAGE_CODE и назначьте предпочитаемый вами язык кода к нему. Например если вы хотите задать немецкий язык языком по умолчанию для нашего проекта, измените код языка следующим:

LANGUAGE_CODE = "de"

Теперь запустите сервер разработки, если он еще не запущен и перейдите к странице "пригласить друга". Там, вы обнаружите, что строки были изменены согласно тому, что вы ввели в немецком переводе файла. Теперь измените значение переменной LANGUAGE_CODE на "en" и обратите внимание, как страница возвращается обратно на английский.

Второй способ настройки заключается в том, чтобы позволить пользователям выбирать язык. Чтобы сделать это, мы должны разрешить класс под названием LocaleMiddleware. Проще говоря, middleware — это класс, который обрабатывает объект запроса или ответа. Многие компоненты Django созданы для использования классов middleware для имплементации функций. Чтобы увидеть это, откройте файл settings.py и найдите переменную MIDDLEWARE_CLASSES. Вы найдете там список строк, и одна из них будет django.contrib.sessions.middleware.SessionMiddleware, которая прикрепляет данные сессии к объекту запроса. Нам не нужно знать, как имплементированы классы middleware перед их использованием. Для включения LocaleMiddleware, просто добавьте путь его класса в список MIDDLEWARE_CLASSES. Следует убедиться, что вы поместили LocaleMiddleware после SessionMiddleware потому что язык middleware использует API сессии, как мы увидим далее. Откройте файл settings.py и измените файл, как это подчеркивается в следующем фрагменте кода:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
) 

Язык middleware определяет активный язык для пользователя, для этого выполняетследующие действия:

  1. Ищет ключ по имени django_language в данных сессии.
  2. Если ключ не существует, он ищет файл cookie по имени django_language.
  3. Если cookie-файл не существует, он ищет код языка в заголовке Accept-Language HTTP. Он отправляется браузером на веб-сервер, указывая на каких языках вы предпочитаете получать содержимое.
  4. Если все это не получилось, используется переменная LANGUAGE_CODE language_code в файле settings.py.

Проделав все описанные выше шаги, Django ищет код языка, который соответствует одному из доступных файлов перевода. Чтобы эффективно использовать язык middleware, нам нужно представление, которое позволяет пользователю выбрать язык и соответствующим образом обновляет данные сеcсии. К счастью,Django уже поставляется с таким представлением для нашего использования. Представление называется setlanguage, и он ожидает, что код языка содержится в GET переменной с именем языка. Он обновляет данные сессии с помощью этой переменной и перенаправляет пользователя на исходную страницу.Чтобы включить это представление, отредактируйте файл urls.py и добавьте следующие выделенные строки:

urlpattems = patterns # il8n
(r'Ail8n/', include(1django.conf.urls.il8n1)),
)

Добавление предыдущих строк похоже на то, как мы добавили записи для интерфейса администратора. Если вы помните из предыдущей главы, функция include() может использоваться для включения URL-записей из другого приложения под определенным путем. Теперь, мы можем позволить пользователю изменить язык на немецкий, предоставив ссылку, например, /i18n/setlang/language=de. Мы изменим базовый шаблон для добавления таких ссылок на все страницы. Откройте файл base.html и добавьте следующие выделенные строки к нему:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd" >
<html></html>
<head></head>
[...]
</head>
<body></body>
[...1
<div id="footer"></div>
Django Mytweets<br>
Languages
<a href="/il8n/setlang/?language=en">EN</a>
<a href="/il8n/setlang/?language=de">DE</a>
</body>
</html>

Кроме того мы стилизуем новый подвал, добавив следующий CSS код для стиля

site_media/style.css:
#footer { margin-top: 2em; text-align: center;
}

Теперь функциональность i18n нашего приложения готова. Укажите вашему браузеру на страницу "пригласить друга" и попробуйте ссылки на новые языки в нижней части страницы. Язык должен изменится, согласно той ссылке, по которой вы перешли.

Прежде чем мы завершим этот раздел, нужно сделать несколько замечаний:

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

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

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

Так что пожалуйста, прочитайте дальше, чтобы узнать об очень важной технике!

Кэширование - улучшение производительности вашего сайта во время большого трафика

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

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

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

Включение кэширования

Мы начнем этот раздел в включения системы кэширования. Чтобы использовать кэширование, необходимо сначала выбрать кэширование внутреннего интерфейса и задавать свой выбор в переменной с именем CACHE_BACKEND в файле settings.py.Содержимое этой переменной зависит от кэширования внутреннего интерфейса, который вы выбрали. Некоторыми из доступных вариантов являются:

  • Простое кэширование: Для этого кэша данные хранятся в памяти процесса. Это полезно только для тестирования, система кэширования во время разработки и не должна использоваться в рабочей фазе. Чтобы включить ее, добавьте следующую строку в файл settings.py:
    CACHE_BACKEND = ' simple’:///' 
  • Кэширование базы данных: В этом случае, данные кэша хранятся в таблице базы данных. Чтобы создать таблицу кэша, выполните команду:
    python manage.py createcachetable cache_table

    Затем добавьте следующую строку к файлу settings.py:

    CACHE_BACKEND = ' db://cache_table'

    Здесь в таблица кэша была названа cache_table. Вы можете назвать ее, как вы хотите, до тех пор, пока название не конфликтует с существующей таблицей.

  • Файловая система кэширования: Здесь, данные кэша хранятся в локальной файловой системе. Чтобы использовать ее, добавьте добавьте следующую строку к файлу settings.py:
    CACHE_BACKEND = "file:///tmp/django_cache" 

    Здесь переменная /tmp/django_cache используется для хранения файлов кэша. Вы можете задавать другой путь, если вам так нравится.

  • Кэширование в память: Кэширование в память является продвинутым, высокоэффективным и обеспечивающим быстрое кэширование средством. Установка и настройка этого способа выходит за рамки этой книги, но если у вас есть сервер, использующий такое кэширование, вы определить его IP и порт в файле settings.py, как показано:
    CACHE_BACKEND = 'memcached://ip:port/'

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

Таким образом, примите решение о кэшировании и вставьте соответствующую переменную CACHE_BACKEND в файл settings.py. Далее, вы должны задать продолжительность срока действия кэшированных страниц в секундах. Добавьте следующую строку в файл settings.py для кэширования страниц в течении пяти минут:

CACHE_MIDDLEWARE_SECONDS = 60 5   

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

Настройка кэширования

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

Кэширование всего сайта

Чтобы кэшировать весь сайт, добавьте класс CacheMiddleware к классу MIDDLEWARE_ CLASSES в файле settings.py:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.Cache.CacheMiddleware',
    'django.middleware.doc.XViewMiddleware',
    'django.middleware.locale.LocaleMiddleware',
) 

Здесь мы определили такой порядок, какой он был, когда мы добавили язык middleware. Класс CacheMiddleware следует добавить после сессии и аутентификации промежуточного классы и перед LocaleMiddleware.

Вот и все, что вам нужно для кэширования вашего сайта на Django. Теперь всякий раз, когда страница запрашивается, Django будет сохранять созданный HTML-код и использовать его позже. Важно понимать, что система кэширования только кэширует страницы, которые не имеют переменных GET и POST.Таким образом, наши пользователи по-прежнему будет возможность отправлять твиты и подписываться на друзей, потому что представления этих страниц ожидают переменных GET или POST. С другой стороны, страницы, таких как списки твитов и хэштегов также будут кэшироваться.

Кэширование определенных представлений

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

Чтобы кэшировать представления, основанные на классе HashTag, вы просто применяете метод, называемый cache_page и параметр кэширования вместе с ним. Попробуйте это, изменив файл mytweets /urls.py как указано в следующем коде:

from django.views.decorators.cache import cache_page
url(r'^search/hashTag$',  cache_page(60 * 15)(SearchHashTag.as_view())),

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

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

Фрагменты шаблона могут быть кэшированы в следующей манере::

% load cache %}
{% cache 500 sidebar %}
.. sidebar ..
{% endcache %} 
< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Константин Боталов
Константин Боталов

Вроде легкие вопросы и ответы знаю правильные, но система считает иначе и правильные ответысчитает неправильными. Приходится выполнть по несколько раз. Это я не правильно делаю или тест так составлен?

Владимир Филипенко
Владимир Филипенко

Листинг показывает в 4-ой лекции, что установлен Django 1.8.4. Тут же далее в этой лекции указаны настройки, которые воспринимает Django 1.7 и младше.