Flask: Вывод данных из БД на страницы сайта

Получение данных из базы данных и вывод их на страницах сайта.

Создание страницы /posts

В файле app.py создадим правило маршрутизации для URL /posts:

@app.route('/posts')
def posts():
    articles = Article.query.order_by(Article.date.desc()).all()
    return render_template('posts.html', articles=articles)

Функция posts() получает все записи из базы данных и передает их в шаблон posts.html. Запрос данных осуществляется следующим образом:

articles = Article.query.order_by(Article.date.desc()).all()

Описание:

  • Article.query обращается к модели Article.
  • .order_by(Article.date.desc()) сортирует статьи по полю date в порядке убывания.
  • .all() возвращает все записи.

Полученный список статей передается в шаблон posts.html с помощью render_template.

Создание шаблона posts.html

Создадим файл templates/posts.html. Заголовок:

<h1>Все статьи на сайте</h1>

Перебор массива articles с помощью цикла Jinja2:

{% for article in articles %}
  <div class="alert alert-info">
    <h2>{{ article.title }}</h2>
    <p>{{ article.intro }}</p>
    <p>{{ article.date.strftime('%Y-%m-%d') }}</p>
    <a href="#" class="btn btn-warning">Подробнее</a>
  </div>
{% endfor %}

Описание:

  • {{ article.title }}, {{ article.intro }}, {{ article.date.strftime(‘%Y-%m-%d’) }} выводят значения полей статьи.
  • strftime(‘%Y-%m-%d’) форматирует дату.
  • <a href="#" class="btn btn-warning">Подробнее</a> — кнопка «Подробнее».

Добавление ссылки и функционала кнопки «Подробнее»

Добавим ссылку на страницу /posts в templates/base.html:

<a href="/posts">Статьи</a>

Для каждой статьи генерируем ссылку вида /post/<id>. Модифицируем код шаблона:

<a href="/post/{{ article.id }}" class="btn btn-warning">Подробнее</a>

В app.py добавим обработчик для URL /post/<int:id>:

@app.route('/post/<int:id>')
def post_detail(id):
    article = Article.query.get(id)
    return render_template('post_detail.html', article=article)

Описание:

  • @app.route(‘/post/<int:id>’) обрабатывает URL с целочисленным параметром id.
  • Article.query.get(id) получает статью по ID.

Создание шаблона post_detail.html

Создадим файл templates/post_detail.html:

<h1>{{ article.title }}</h1>
<p>{{ article.text }}</p>
<p>{{ article.date.strftime('%Y-%m-%d') }}</p>

Этот шаблон выводит полную информацию о статье. После добавления новой статьи, перенаправим пользователя на страницу /posts в app.py:

return redirect(url_for('posts'))

Отображение данных из базы данных в Flask: вывод списка статей и подробной информации об отдельной статье. В последующих уроках будет реализован функционал редактирования и удаления статей.

Что будем искать? Например,программа