КОДИРОВКА WEB-ПУБЛИКАЦИИ В ZOPE Неудачин И.Г.

Уральский федеральный университет


Номер: 6-1
Год: 2015
Страницы: 91-96
Журнал: Актуальные проблемы гуманитарных и естественных наук

Ключевые слова

Zope 2, Web-публикация объектов, локализация , Zope 2, objects Web-publishing, locale

Просмотр статьи

⛔️ (обновите страницу, если статья не отобразилась)

Аннотация к статье

Исследуется проблема кодировки и русификации Web-публикации базовых объектов созданных в инфраструктуре Zope 2. Интегрируются предложенные в WWW меры для сервера, интерфейса управления и системы презентации .

Текст научной статьи

Кириллица в Zope. Актуальная проблема повышения глобального рейтинга российского университета [1, 23] решается, в том числе, путем Web-публикаций [2, 75]. Отсюда вытекает проблема адаптации сетевой инфраструктуры разработки приложений к русскому языку. Сервер Web-приложений Zope дает объектную платформу разработки в отличие от обычных файл-ориентированных систем Web-публикации шаблонов страниц, таких, как PHP и ASP. Инфраструктура Zope позволяет разработчикам специализироваться в своей области, т. к. разделяет содержание, логику обработки данных и дизайн публикации объектов. В Zope 2.6.0 появилась и продолжает развиваться поддержка unicode. Из-за особенностей реализации, сервер потерял возможность нормальной работы с национальными языками (в т.ч. с русским) в режиме, отличном от unicode. Устраним ошибки в новом коде Zope и сделаем возможной полноценную работу с сервером в любой кодировке. Примеры этой работы реализованы в экземпляре сервера Zope 2.9.6, но имеют общий характер для других версий. Войдите в экземпляр сервера Zope 2.9.6 и создайте папку ZopeRU с надписью title "Zope по-русски". В интерфейсе управления вы увидите вместо букв кириллицы их коды: Zope по-русски Таким образом, существуют проблемы с кодировкой кириллицы в Zope, которые необходимо решить на русскоязычном сайте. Свойства кодировки объектов. Свойства - это способ ассоциировать информацию с объектами в Zope. Многие объекты Zope, включая папки и документы, могут иметь свойства. Свойства (закладка представления Properties в интерфейсе управления), например, могут идентифицировать тип содержимого объекта (многие объекты Zope имеют свойство content type). Другое применение свойств - предоставлять метаданные (meta-data) об объекте, такие как автор объекта, его заголовок (title), статус, и т. д. Свойства могут быть более сложными, чем строки; они могут быть числами, списками и иными структурами данных. Все свойства объекта управляются через вкладку Properties. Кодировка настраивается в свойствах корневого каталога. Добавим в код интерфейса управления Zope возможность явно указать кодировку страниц. 1. Войдите в корневую папку Root Folder сервера Zope. Выберите закладку Properties и заполните три окна ввода нового свойства внизу страницы. В поле Name введите имя свойства management_page_charset, а в поле Value - значение свойства, равное CP1251 (или другую желаемую кодировку, например, koi8-r, utf-8) [3, 2]. В поле Type оставьте тип string и нажмите кнопку Add. Убедитесь, что свойство management_page_charset с заданными параметрами появилось в представлении Properties. Нажмите кнопку Save Changes и вернитесь к представлению Contents. 2. Проверим появление русских названий. Выберите объект - папку ZopeRU и на его закладке свойств Properties замените коды в названии Title на "Zope по-русски". Нажмите кнопку Save Changes. Убедитесь, что в папке корня правильно отображается название ZopeRU так как было введено "Zope по-русски", т. е. ZopeRU (Zope по-русски). Если вместо русских букв появляются непонятные символы, проверьте кодировку страницы вашего Web-браузера в меню Вид/Кодировка. Она должна соответствовать значению поля Value в свойстве management_page_charset папки корня Zope - кириллица Windows. Русские буквы в Zope. Рекомендуется указывать в интерфейсе управления Zope кодировку, идентичную кодировке сервера. Вот меры по настройке нужной кодировки страниц портала. 1. Кодировка экземпляра задается в файле конфигурации …etc\zope.conf. Откроем файл конфигурации в текстовом редакторе для редактирования. Директива кодировки издателя Zpublisher по умолчанию закрыта символом комментария # # default-zpublisher-encoding utf-8 Уберем символ комментария '#'. Для того чтобы кодировка по умолчанию для Web-браузера была CP1251, подставим ее на место utf-8 default-zpublisher-encoding CP1251 и сохраним файл после редактирования. Директива default-zpublisher-encoding задает набор символов для кодирования данных unicode, которые попадают в Zpublisher. Если не указано явно другое кодирование, то останется код по умолчанию iso-8859-15. Перезапустим Zope. Сейчас браузер запомнит кодировку "Кириллица (Windows)" и разработчику, и посетителю не потребуется ее устанавливать вручную повторно при переключении страниц. Кроме того, в форме редактирования Page Template появилось дополнительное поле Encoding для указания кодировки загружаемого файла. В этом поле указано значение CP1251. 2. Дополнительный способ - установить кодировку в заголовке каждой Web-страницы вашего портала. Копируйте в Examples. Редактируйте объект standard_html_header из корневой папки на закладке Edit, используя тег . Впишите тег в текст заголовка этого метода DTML на закладке Edit. dtml-title_or_id Сохраните изменения кнопкой Save Changes. Браузер будет считывать задание CHARSET=windows-1251", и не потребуется настраивать кодировку страницы вручную. Такой подход опирается на метод заимствования Zope для классов объектов. Если сохранить в заготовках методов и документов DTML строку то настройки standard_html_header из корневой папки будут действовать в новых объектах без явного указания. Шаблон страницы Page Template по-русски. Если вы предпочитаете писать шаблоны страниц по-русски, это делается не в Web-браузере. Необходимо оформить текстовые страницы в любом редакторе на вашем компьютере, а затем загрузить их в новый объект Page Template, как это описано дальше. Редактировать Page Template с кириллицей и сохранять изменения Save Changes через Web-интерфейс внутри Zope не удастся. Лучше не пишите по-русски названия Title у шаблонов страниц - будет исключительная ситуация с потерей доступа к объекту. 1. Создайте на вашем компьютере текстовый файл с именем "RU.htm". Заполните его следующим содержанием: The title

title или id контента необязательный заголовок шаблона

Это Page Template, шаблон страницы template id. Сохраните файл и запомните, куда вы его записали. Можно проверить код в index.htm, открыв файл в окне браузера title или id контента необязательный заголовок шаблона Это Page Template, шаблон страницы template id. Браузер игнорирует теги tal: при выводе файла на экран. 2. Войдите в папку ZopeRU. Выберите шаблон страницы Page Template в списке объектов Add. Откроется форма добавления шаблона страницы Add Page Template. Введите в поле шаблона страницы Id обозначение имени "RU". Последний элемент формы добавления - кнопка просмотра Обзор…. Щелкните этой кнопкой. Браузер выведет диалоговое окно выбора файла. Выберите на диске созданный файл "RU.htm". Нажмите Add и вернётесь в представление Contents папки ZopeRU с новым шаблоном RU. Не пользуйтесь кнопкой Add and Edit, т. к. сохранить изменения или загруженный текст в этом случае не удастся. Будет выдано сообщение об ошибке, например Error Type: UnicodeDecodeError Error Value: 'ascii' codec can't decode byte 0xd3 in position 199: ordinal not in range(128) как только вы попытаетесь сохранить код шаблона с кириллицей Save Changes. 3. Щелкните закладку Test и посмотрите, как браузер интерпретировал текст из файла "RU.htm". Zope по-русски Это Page Template, шаблон страницы RU. Тег tal:replace="here/title_or_id" выдал заголовок папки "Zope по-русски", а тег template id показал имя RU шаблона страницы курсивом. Тест прошел успешно, т. к. название папки, в которой находится шаблон действительно "Zope по-русски", Редактировать Page Template с кириллицей при этих настройках можно только в текстовом файле на вашем ПК. Задача - сделать этот код динамическим, решена. Если изменится заголовок папки (сайта), то это будет автоматически учтено без вмешательства Web-дизайнера или администратора. Решение проблемы с кодировкой внутри Zope. Интересно, что указание кодировок, фактически, уже есть: давно известно, что для корректной работы сервера обязательно должна быть задана локаль (в т. ч. кодировка). Также естественно, указывать в этом случае кодировку в тегах meta и в заголовках на страницах интерфейса управления Zope (иначе некоторые браузеры отказываются нормально посылать запросы). В простейшем случае предполагается совпадение этих двух кодировок. Сообщение об ошибке UnicodeDecodeError содержит комментарий того, что встретился код, который вышел за пределы диапазона значений 0..127, доступного 'ascii'. 1. У необязательного параметра кодировки "encoding" в преобразованиях unicode есть значение по умолчанию. encoding = "ascii" # Значение по умолчанию из _PyUnicode_Init() Оно обычно равно ascii, но его можно поменять, отредактировав файл Zope2_9_6\Python\Lib\site.py (файл скрипта находится в установке Zope) и проставив там желаемую кодировку. Модуль site.py добавления в sys.path путей поиска сторонних пакетов содержит описание функции setencoding(), которая устанавливает unicode кодирование строки. Значение по умолчанию - 'ascii', но если есть желание экспериментировать, его можно изменить [4, 4]. Нужная вам функция setencoding() указания кодировки выглядит вот так: def setencoding(): encoding = "ascii" # Default value set by _PyUnicode_Init() if 0: # Enable to support locale aware default string encodings. import locale loc = locale.getdefaultlocale() if loc[1]: encoding = loc[1] if 0: # Enable to switch off string to Unicode coercion # and implicit Unicode to string conversion. encoding = "undefined" if encoding != "ascii": # On Non-Unicode builds this # will raise an AttributeError... # Needs Python Unicode build ! sys.setdefaultencoding(encoding) Поставьте 1 в первом операторе if, т. е. if 1: вместо if 0: В этом случае безусловно будет выполняться опертор loc = locale.getdefaultlocale(). Последний (т. к. выполняется условие encoding != "ascii") задает кодировку sys.setdefaultencoding(encoding) из локали соответствующего модуля locale. 2. Если ваш Python не поддерживает модуль locale, или если запрашиваемый locale не будет распознан вашей системой, то возникнет ошибка, и Zope не стартует. Локаль сервера задана по умолчанию. Если локаль не указана явно, то сервер игнорирует какие-либо установки локали (Default: unset). Для неанглоязычных серверов это может оказаться фатальным: не будет работать поиск посредством ZCatalog и форматирование с использованием StructuredText. Кроме того, начиная с версии Zope 2.6.0, будет невозможно использовать страницы управления свойствами [5, 116]. Настроим русские локали. Откройте файл конфигурации экземпляра сервера etc\zope.conf в любом текстовом редакторе. Для настройки locale найдите в файле zope.conf строку # locale fr_FR Команда не выполняется, т. к. закрыта символом # и, поэтому является комментарием. Уберите символ # и задайте русскую локализацию [6, 2]. locale Russian_Russia.1251 3. После выполнения настройки становится возможно применять кириллицу в шаблонах страниц и в их заголовках. Таким образом, сайт становится русскоязычным. Выполните тестирование в загруженном из текстового файла шаблоне Page Template с идентификатором RU, в который добавьте заголовок "ZPT по-русски". Когда вы сохраните изменения кнопкой Save Changes, не появится сообщение об ошибке. После тестирования на вкладке Test в нашем случае получен правильный результат. Тест прошел, т. к. название папки, в которой находится шаблон действительно "Zope по-русски", а главное заключается в том, что кириллица в шаблоне и в его заголовке "ZPT по-русски" не вызвало ошибок при сохранении объекта. Id объекта на родном языке. Можно научить Zope понимать русский (и другие) языки в поле имени объекта Id. При добавлении объекта в Zope необходимо задавать его имя Id, которое должно состоять из символов ascii. Zope проверяет символы и выдаёт ошибку, если Id не соответствует этим требованиям. Проверку можно отключить в скрипте ObjectManager.py, который находится в каталоге платформы, а не экземпляра Zope [7, 2]. …\Zope\lib\python\OFS\ObjectManager.py Требуется изменить описание функции checkValidId: def checkValidId(self, id, allow_dup=0): … if bad_id(id) is not None: raise BadRequest, ( 'The id "%s" contains characters illegal in URLs.' % escape(id)) Необходимо закрыть комментариями оператор вызова исключения raise и добавить пустой оператор pass: def checkValidId(self, id, allow_dup=0): … if bad_id(id) is not None: # raise BadRequest, ( # 'The id "%s" contains characters illegal in URLs.' # % escape(id)) pass После чего следует перезапустить экземпляр сервера. Проверим, поменяв Id каталога ZopeRU на "Zope по-русски" и стерев название. Поместите внутрь "Zope по-русски" копию шаблона страницы RU с новым именем "ZPT по-русски" без заголовка Title. Test шаблона страницы "ZPT по-русски" выдаст: Zope по-русски Это Page Template, шаблон страницы ZPT по-русски. Добавьте метод DTML с русским идентификатором "DTML по-русски" и посмотрите его на закладке View. Zope по-русски This is the DTML по-русски Document in the Zope по-русски Folder. Аналогичный результат получен для объекта публикации DTML Document. Мы тестировали четыре базовых объекта публикации контента: Folder, Page Template, DTML Method (рисунок): Рис. Объекты с русскими идентификаторами Тест не вызвал ошибок. Теперь Zope позволяет создавать объекты на любом языке, включая русский. Всё проверено в ZOPE 2.9.6 и работает без сообщений об ошибках для Windows XP Professional. Недостаток - в адресной строке браузера не отображаются русские символы из имени объекта, а только их коды. Например, http://localhost:8080/ZPT%20%EF%EE-%F0%F3%F1%F1%EA%E8 вместо http://localhost:8080/ZPT по-русски Возможные отрицательные последствия изменения ObjectManager.py в настоящее время не обнаружены. Заключение. Систематизированы меры поддержки русской локализации платформы Web-публикации объектов Zope. Эти меры позволяют применять кириллицу во внутреннем интерфейсе управления и на страницах внешнего представления контента сервера в браузере. Проводится дальнейшее тестирование настроек русского языка в инфраструктуре Web-публикации объектов Zope.

Научные конференции

 

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