Мое тестовое catalyst-приложение начинает потихоньку развиваться и приобретать функциональность. Для создания интерфейса администратора я решила использовать jQuery UI и мне потребовалось добавить в шаблоны ссылки на статические файлы. Ссылки были добавлены, каждую из них catalyst попытался обработать и вернул 404.
Решив, что с этой проблемой может столкнуться любой начинающий разработчик, решила написать небольшую заметку о том, как заставить catalyst адекватно обрабатывать статические файлы.
Приведенный код строится на ранее созданной основе: https://dev-lab.info/2013/11/как-создать-catalyst-приложение-с-нуля
1. Для работы со статикой надо подключить модуль Static::Simple и выполнить настройки.
/lib/app.pm :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use Catalyst qw/ Static::Simple /; ... __PACKAGE__->config( 'Plugin::Static::Simple' => { include_path => [ '/static', app->config->{root}, ], ignore_dirs => [ qw/images css js help/ ], } ); ... __PACKAGE__->setup(); |
- include_path
include_path позволяет задать список путей, где catalyst-приложение будет искать ваши статические файлы. Для того, чтобы добавить корневой каталог, надо использовать MyApp->config->{root}. - ignore_extensions
По-умолчанию, типы файлов tmpl, tt, tt2, html и xhtml — статическими не считаются, независимо от того — в какой директории они размещены. Попытка обратиться к ним, в рамках статических директорий, вызовет ошибку:
1Static::Simple: Ignoring extension `html`
Чтобы изменить поведение Static::Simple и позволить catalyst-приложению использовать html-файлы, например, для организации статических страниц руководства пользователя, можно переопределить список игнорируемых расширений с помощью опции ignore_extensions. Либо просто использовать другие расширения файлов, например, *.htm вместо *.html. - ignore_dirs
ignore_dirs подсказывает catalyst, какие директории содержат статику и не подлежат специальной обработке. При этом, не важно где размещается указанная директория. Если указано: ignore_dirs => [ qw/images/ ],
123/root/static/images/root/images/root/src/images
— все файлы этих директорий будут обрабатываться, как статичные - expires
Использование expires приводит к тому, что в заголовках http-ответа будет возвращаться поле Expires. Значение поля будет зависеть от того, какое количество секунд было указано в параметре expires.
Более подробный список опций для конфигурирования Static::Simple приведены в официальной документации, см. раздел «Полезные ссылки»
2. Интерфейс администратора, для работы с логами, будет доступен в специальной директории. Создаем специальный контроллер.
/lib/app/Controller/Log.pm :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package app::Controller::Log; use uni::perl ':dumper'; use Moose; use namespace::autoclean; BEGIN { extends 'Catalyst::Controller' } sub index :Path('/log') :Args(0) { my ( $self, $c ) = @_; $c->stash->{template} = 'log/index.tt'; } __PACKAGE__->meta->make_immutable; 1; |
3. Создаем шаблон для вывода главной страницы интерфейса администратора. Для начала, выведем по центру картинку. Картинка лежит по адресу /root/static/images/catalyst_logo.png.
/root/src/log/index.tt :
|
1 2 3 4 5 6 |
<html> <body> TEXT <img src="/static/images/catalyst_logo.png"> </body> </html> |
После этого запускаем сервер и заходим на страницу http://localhost:3000/log .
4. Можно добавить «руководство пользователя», раздел помощи на сайте, разместив статические файлы в catalyst-приложении.
/root/static/help/index.htm :
|
1 2 3 4 5 |
<html> <body> <b>Hello!</b> </body> </html> |
После запуска сервера этот файл будет доступен по адресу http://localhost:3000/static/help/index.htm