Создание статичного сайта с помощью flask-приложения
Если возможностей кэширования недостаточно, или вы не хотите настраивать сервер под запуск flask-приложения, можно, разрабатывая flask-сайт на локальном компьютере, реализовать генерацию статичных html-страниц. Эти готовые страницы (без jinja-вставок, без необходимости выполнения функций на стороне бэкенда) потом загружаются на сервер.
Если необходимость в этом отпадет, всегда можно вернуться к динамической версии сайта. Flask-приложение никуда не денется, вы будете работать с ним на локальном компьютере и можете перенести на удаленный. Это можно сделать сразу и генерировать статику уже там. Далее, меняя настройки веб-сервера, решать какую версию сайта "отдавать" на запросы. Со статикой, например, будет проще выпустить сертификат безопасности SSL.
Основным минусом данного подхода является усложнение файловой структуры проекта. Если в статической версии сайта ссылки на изображения имеют вид /images/*.png, то каталог images должен находиться в папке, которая будет корневой для статичного сайта. Это же касается css-, js-файлов и других. Соответственно, во flask-приложении должна быть правильно настроена маршрутизация. Например:
@app.route('/images/<path:img>') def load_img(img): return send_from_directory('site/images', img)
Другой минус - при внесении даже небольших изменений (например, в меню сайта), потребуется заново генерировать все статичные страницы или раздел. Если меняется содержимое статьи одной страницы, то перезаписывать все нет смысла. В этом случае приложение должно иметь возможность генерации только одной страницы.
Сам по себе способ создания статичной html-страницы прост. Результат, который возвращает функция render_template
не передается оператору return
во view-функции (имеющей декоратор route
), а записывается в файл в каталоге для статичной версии сайта. Функция, в теле которой вызывается open
и применяется метод write
к файловому объекту, не обязана быть view-функцией.
Если генерируются все страницы сайта или раздела, в теле функции надо перебирать файлы соответствующего каталога (template или его подкаталога). Пример:
def blender_site(): files_list = os.listdir('templates/blender') files_list.remove('TEMPLATE.html') for file in files_list: nav = sidebar.active_link('blender', file[:-5]) with open(f'site/blender/{file}', 'w') as f: f.write(render_template(f'blender/{file}', sidebar=nav, address=f'blender/{file[:-5]}'))
Здесь сначала получаем список html-страниц flask-приложения (содержат jinja), удаляем из него ненужную. Далее перебираем список в цикле. Для каждого имени открываем статичный файл и записываем в него результат рендера шаблона из flask-проекта. Переменная nav содержит меню сайта с подсвеченной ссылкой активной страницы. Это исключительно особенность проекта, откуда был взят пример.
Функции, генерирующие статику, могут быть помещены в отдельный модуль. Вызывать их следует из основного файла приложения, поместив вызов в другую функцию. Например, при загрузке определенной страницы. Можно закомментировать вызовы и убирать #
, когда такая генерация необходима.