Сайт на Flask с базой данных
В большинстве случаев изучение бэкенд-фреймворков связано с созданием базы данных. При этом работу с БД реализуют через веб-интерфейс. На html-страницах создаются кнопки для добавления статьи, ее правки, сохранения, удаления. В приложение добавляется код, позволяющий открывать статью на редактирование по отдельному пути и т. д.
Чтобы каждый посетитель не мог вносить изменения на сайте, в веб-приложении должен быть код, который обрабатывает сессии, вход/регистрацию пользователей, разрешения для разных ролей. Вместе с этим html-шаблон будет сложнее.
Однако если сайт правит только один человек, это кажется лишним. Даже если скрыть ненужные посетителям кнопки и предоставлять доступ к редактированию только администратору, за счет разрастания кода приложение станет "тяжелее".
Решением может быть создание другого приложения, которое использует только владелец сайта и которое реализует правку базы данных. Другими словами, база данных одна, но одно приложение (работающий для пользователей сайт) обращается к ней исключительно для получения данных, второе (используемое администратором) ‒ для правки/добавления статей.
Что из себя будет представлять это "приложение администратора" ‒ вопрос предпочтений, ваших навыков разработки, удобства. Это может быть созданное под конкретный проект GUI-приложение, например, написанное на том же Tkinter, через которое вы работаете с базой данных на своем локальном компьютере.
Или в рамках этого же проекта может быть еще одно flask-приложение, которое никогда не запускается на удаленном веб-сервере. При этом редактирование БД выполняется через веб-страницу, на которой размещается форма с полями для ввода/изменения данных.
Понятно, что ничего этого можно не делать, а записи базы данных править "вручную" командами SQL. Однако это неудобно.
Следует хорошо подумать, действительно ли вам нужна база данных, или в случае информационного сайта с небольшим количеством страниц удобнее иметь набор обычных html-файлов, как это было рассмотрено в предыдущих уроках. В таком случае вы всегда сможете править статьи без лишних усилий в привычном вам редакторе. Это может быть куда удобнее, если страницы ресурса существенно отличаются между собой по своей структуре и оформлению.
Кроме того, при разработке проекта на основе базы данных усложняется разработка и появляются дополнительные требования к знаниям. Последующие уроки данного курса предполагают, что вы хотя бы поверхностно знакомы с языком SQL, модулем sqlite3 языка Python, имеете представление об html-формах. Познакомиться с языком SQL и SQLite в частности можно в этом курсе. Там же в конце приводятся краткие сведения по модулю sqlite3 языка Python.
С другой стороны, БД дает такие возможности в случае их необходимости, как легкая систематизация данных, разные формы представления информации, реализация комментариев и др. База данных ‒ почти необходимость для крупных проектов, сайтов-магазинов, при планировании дальнейшего развития ресурса в сторону хранения каких-либо пользовательских данных.
Далее мы будем постепенно изменять копию ранее созданного проекта таким образом, чтобы flask-приложение работало с базой данных, статьи хранились не в отдельных файлах, а в таблице БД. Для этого выполним ряд подготовительных действий.
Сейчас в каталоге templates имеется файл base.html с двойным назначением. Он является родительским шаблоном для вложенных в подкаталоги файлов-страниц (которые уже не понадобятся), а также отдается сервером при запросе главной страницы.
Поскольку нам будет необходима страница с веб-формой, создадим еще один шаблон, который назовем create.html. Для поддержания единообразного вида сайта как в "режиме" правки, так и просмотра, наследовать он будет от того же base.html. При этом сам base.html придется немного изменить:
- Удалите меню сайта (лучше просто закомментируйте или вырежьте и где-нибудь сохраните, так как образец кода меню позже понадобится). Удалять надо от первого
<button class="accordion">
до закрывающего</nav>
, не включая его. Вместо меню вставим текст-заполнитель "Здесь будет меню". - Перед закрывающим
</head>
добавим блок{% block styles_scripts %}{% endblock %}
. Если в дочернем шаблоне понадобятся дополнительные стили и js-скрипты, они будут помещаться в этот блок.
В каталоге templates создадим файл create.html:
{% extends 'base.html' %} {% block styles_scripts %} {% endblock %} {% block title %}{{ h1 | default("Создать новую статью") }}{% endblock %} {% block content %} <p>Здесь будет форма</p> {% endblock %}
Выражение h1 | default("Создать новую статью")
означает, что когда имеется переменная h1, выводится ее значение. Если нет, отображается значение по-умолчанию. Значение h1 будет у статей при их правке, но не когда страница только создается.
Код в файле project.py пока оставим в покое. Мы исправим его после того, как напишем flask-приложение для редактирования базы данных, которое назовем admin.py:
from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): return render_template('create.html')
При запуске программы командой
flask --app admin run --debug
должно получиться что-то вроде этого: