7. Создание блога на Flask (уроки) - Миграции, теги, связь тегов и постов

preview_player
Показать описание
Мои курсы:
Boosty:

Patreon:

Уроки Flask. Введение в создание сайтов на Python при помощи фреймворка Flask на примере блога. Используется Python 3.

Реализация механизма миграций.
Создаем Теги для Постов.
Устанавливаем ManyToMany отношения между Постами и Тегами.

Комманды:

*** ИСХОДНЫЙ КОД ***
Основных проектов доступен в Patreon:
***

------

🔷 Для донатов. Всегда очень признателен за это:

Также может пригодиться:

★ Важно:

Как читать Traceback Python:

Работа с ошибками на примере двух нерабочих парсеров:

★ Все серии “Уроков создания блога на Flask”

1. "Демка проекта"

2. Подготовка к работе

3. Cоздание приложения, HTML шаблоны

4. Наследование шаблонов

5. Blueprints

6. Cоздание постов (модели) и SQLAlchemy

7. Миграции, теги, связь тегов и постов

8. Поиск и форма создания поста

9. Добавление постраничной навигации

10. Форма редактирования постов и админка

11. Авторизация админа, базовая кастомизация админки

12. Страница 404, кастомный CSS

★ Плейлисты:

Django 2.x:

Боты для Телеграма:

Python casts:

Работа с API Вконтакте:

Серия уроков Flask для начинающих. Изучаем создание сайтов на Flask на примере блога.

#Flask #урокиFlask #проектНаFlask
Рекомендации по теме
Комментарии
Автор

Для тех, кто смотрит урок спустя 3 года:

flask-script больше не поддерживается. Не устанавливайте его, вместо этого вам стоит:
1) Из трех строк
migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command('db', MigrateCommand)
оставьте только первую
2) Создавать файл manage.py не нужно, миграции создаются командой
$ flask db init

У flask теперь есть свой менеджер для этих команд, поэтому вам не нужно создавать его вручную

davidalkamyan
Автор

werkzeug удивил своими исправлениями )) В некоторых местах. Очень полезная вещь.

Спасиба вам за урок.

dimakrilovskiy
Автор

Олегу респект!
Прошел данный урок до конца. Делал всё как на видео, только использовал PostgreSQL.
Потратил на данный урок пару дней (из-за невнимательности) и всё получилось))

odsmplf
Автор

Классный урок, очень много нового узнал о Python

yqdngjp
Автор

Великолепно! Спасибо огромное, отличная и по-настоящему профессиональная подача материала! А один хороший человек дизлайк еще влепил, аяяяй.

RRaijin
Автор

на 13:56 не забываем закрыть " > "

return '<Tag id: {}, name: {}>'.format(self.id, self.name)

ArtemkaRocks
Автор

Спасибо за видео. Долго пришлось повозиться с базой. Почему то думал что колонка tags должна была появиться в таблице Tag и posts в Post.

deihhse
Автор

Отобразить теги с bootstrap4, tags - теги конкретного поста, переданные шаблонизатору:
{% block content_title %}
{{ post.title }}

<div class="tags">
{% for tag in tags %}
<a href="#" class="badge badge-primary">{{ tag.name }}</a>
{% endfor %}
</div>
{% endblock %}

current
Автор

А если в post_tags добавить поле datetime. Как можно грамотно вывести кортежи (тег, время)?

eidos
Автор

возникла проблема с добавлением в бд новых классов, при апгрейде выходить ошибка описывающая то, что в базе данных уже есть таблица 'post' но я бл#ть апгрейжу чтобы добавить туда Tag, а потом и post_tags, команда "db stamp head" позволила сделать миграцию без ошибки, но в апгрейде таже ошибка, а в папке versions уже 2 документа, один самый первый, в котором есть Post, а второй имеет в себе Post & Tag, я не понимаю что с этим делать, знакомые сказали дропнуть generate schema, но я даже не вдупляю где это и как ее дропнуть.
с этой ошибкой я както продолжил кодить, но наткнулся на еще одну, теперь джинджа мне пишет - expected token 'end of print statement', got 'tag'
я переименовывал tags
, но это не помогло, искал почему данная ошибка возникает. вобщем по своей глупости или какойто внешней причины я сижу над этим роликом уже 7 часов и не могу решить проблему

hollymood
Автор

Создал blueprint для тэгов, получилось прикольно, потому что можно посмотреть все существующие тэги теперь.

vladimirpetrov
Автор

У всех отображается при редактировании через админку поста тег, и при редактировании тега пост?

spoc
Автор

На момент проработки данного материала во избежании AttributeError: 'InstrumentedList' object has no attribute 'all'
tag.posts вернёт нам InstrumentedList, наследованный от обычного питоньего списка, по которому можно проитерироваться в цикле for, не имеет метода all()

@posts.route('/tag/<slug>')
def tag_detail(slug):
tag = Tag.query.filter(Tag.slug == slug).first()
posts = tag.posts
return render_template('posts/tag_detail.html', tag=tag, posts=posts)

current
Автор

Поскольку тэги это экземпляр класса Post, то отобразить их можно гораздо проще, зарендерив прямо в шаблоне:
<h4>{% for tag in post.tags %}<span class="badge bg-secondary mx-1">{{ tag.name }}</span>{% endfor %}</h4>

archyt
Автор

Я через импорт данных в БД внёс посты и потому слагов не было.
При вызове страницы с постами, вываливалось исключение.
Сначала сделал отдельный скрипт, что бы прогнать таблицу и внести изменения.
Потом решил что удобнее в блюпринте, добавил функцию:
j = Post.query.filter((Post.slug is None) or (Post.slug == '')).all()

for i in j:
i.slug = slugify(i.title)
db.session.add(i)
db.session.commit()Теперь, если мы вызываем страницу с постами, то функция выбирает все посты без слагов, добавляет автоматом слаг для них.

AlexandrSpirit
Автор

Кстати, а уроки по работе с хостингами/серверами и как заставить сайт работать в интернете будут ?

ArtemkaRocks
Автор

Здравствуйте, в этом плейсте будет объяснение как в сайт внедрить изображения? заранее спасибо

drabbit
Автор

Подскажите, почему при команде python manage.py db upgrade, я получаю INFO [alembic.runtime.migration] Running upgrade bfec9ac53a11 -> 0e6f30233e13, empty message и всё, процесс зависает. При первой инициализации БД всё хорошо, но при последующих миграциях я просто не могу сделать апдейт.

andrewslee_channel
Автор

Как уже заметили, в новой версии Flask не нужно создавать отдельный файл migration.py, а для того, чтобы сделать миграцию достаточно только в вашем файле с приложением (тот который содержит объекты классов Flask и SQLAlchemy - в видео Олега это переменные app и db) импортировать класс Migrate и создать объект этого класса, т.е.
from flask_migrate import Migrate
migrate = Migrate(app, db)
Далее, чтобы сделать миграцию, нужно открыть командную строку (для Windows) в папке с приложением и выполнить следующие команды
flask --app your_app_name.py db init (создается папка migrations и конфиг файлы)
flask --app your_app_name.py db migrate -m "Some comments" (в папке migrations создается python скрипт для апгрейда и даунгрейда вашей БД)
flask --app your_app_name.py db upgrade (происходит апргрейд БД, т.е. ваша БД поменяется в соответствии с моделями, которые у вас сейчас описаны)

PS Если файл с приложением называется app.py, то команды будут короче:
flask db ...
PPS Слово 'db' в команде flask db никак не связано с именем переменной 'db' (экземпляр SQLAlchemy) в вашем коде. Переменная может называется как угодно, команда все-равно будет flask db. Я не сразу это понял.

Олег, спасибо за уроки!

denisp
Автор

Олег, скажите, пожалуйста, как сделать связь между таблицами один к одному....нигде не могу найти. Спасибо

klgpqww