Flask и Python для веб-серверов: пошаговая инструкция создания
Для кого эта статья:
- Новички в веб-разработке, желающие освоить основы работы с Flask
- Люди, которые хотят создать свой веб-сервис или API, но испытывают трудности с пониманием документации
Студенты и другие обучающиеся, интересующиеся развитием навыков программирования на Python
Python + Flask = идеальная формула для создания веб-серверов! Если ты давно мечтал запустить собственный сайт или API, но терялся в сложных инструкциях и непонятных терминах — эта статья специально для тебя. Я расскажу о создании сервера на Flask так, как объяснял бы другу за чашкой кофе: просто, поэтапно и с примерами кода, который сработает с первого раза. От установки до первого запуска приложения — всего 5 шагов, и ты станешь создателем собственного веб-сервера! 🚀
Хочешь не просто прочитать, а полностью освоить веб-разработку на Python? Обучение Python-разработке от Skypro — это практический курс, где ты создашь не учебный, а настоящий веб-сервер под руководством экспертов. За 9 месяцев ты пройдёшь путь от новичка до junior-разработчика с портфолио проектов. Возможна оплата в рассрочку, а трудоустройство гарантировано!
Что такое Flask: основы создания веб-серверов на Python
Flask — это микрофреймворк для Python, который позволяет создавать веб-приложения быстро и с минимумом кода. Он "микро" не потому что маленький или ограниченный, а потому что предоставляет только самое необходимое для старта, позволяя разработчику выбирать дополнительные компоненты самостоятельно.
Ключевое преимущество Flask — его простота и гибкость. Вместо того чтобы навязывать определённую структуру проекта (как Django), Flask даёт вам холст, на котором вы рисуете так, как считаете нужным. Это отлично подходит для новичков: вы можете начать с малого и постепенно добавлять сложности.
Иван Соколов, Python-разработчик
Помню свой первый проект на Flask — я создавал API для небольшого семейного бизнеса. До этого пробовал Django и чувствовал, что стреляю из пушки по воробьям. С Flask всё встало на свои места. За пару выходных я написал сервис, который автоматизировал бронирование столиков в кафе родителей.
Начинал я с одного файла на 50 строк кода. Спустя год этот проект вырос в полноценную систему управления заведением: от учёта запасов до аналитики загруженности. Flask рос вместе с моими потребностями, и я ни разу не почувствовал, что фреймворк меня ограничивает.
Архитектурно Flask построен на принципах маршрутизации запросов: вы определяете функции, которые должны выполняться при обращении к определённым URL-адресам вашего приложения. Это делает код интуитивно понятным даже для тех, кто только начинает знакомиться с веб-разработкой.
| Характеристика | Flask | Django | FastAPI |
|---|---|---|---|
| Размер фреймворка | Микро | Полный | Микро |
| Кривая обучения | Пологая | Крутая | Средняя |
| ORM в комплекте | Нет (есть SQLAlchemy) | Да | Нет (есть SQLAlchemy) |
| Админ-панель | Нет (нужны дополнения) | Да | Нет (нужны дополнения) |
| Идеально для | Небольших проектов и API | Крупных проектов | Высокопроизводительных API |
Вот базовые компоненты, которые составляют основу Flask-приложения:
- Маршрутизация (Routing) — определяет, какой код должен выполняться при обращении к конкретному URL
- Шаблонизатор Jinja2 — позволяет создавать динамические HTML-страницы
- Werkzeug — библиотека для работы с WSGI (протокол взаимодействия веб-сервера с Python-приложениями)
- Контекст запроса — предоставляет доступ к данным текущего HTTP-запроса
- Дебаггер — удобный инструмент для отладки приложения во время разработки
Flask следует принципу "сначала конвенции, потом конфигурация" — это значит, что он предлагает разумные настройки по умолчанию, но позволяет изменить практически любой аспект поведения через конфигурацию.

Настройка окружения для Flask сервера: от установки до запуска
Перед созданием вашего первого Flask-приложения необходимо настроить рабочее окружение. Я рекомендую использовать виртуальное окружение для каждого проекта — это позволит избежать конфликтов между зависимостями разных проектов. 🔧
Вот пошаговое руководство по настройке среды разработки:
- Убедитесь, что Python установлен на вашем компьютере (рекомендуется версия 3.8 и выше)
- Создайте новую директорию для вашего проекта
- Откройте терминал и перейдите в эту директорию
- Создайте виртуальное окружение
- Активируйте виртуальное окружение
- Установите Flask через pip
- Проверьте установку
Давайте рассмотрим эти шаги подробнее с конкретными командами для разных операционных систем.
| Шаг | Windows | macOS/Linux |
|---|---|---|
| Создание виртуального окружения | python -m venv venv | python3 -m venv venv |
| Активация виртуального окружения | venv\Scripts\activate | source venv/bin/activate |
| Установка Flask | pip install flask | pip install flask |
| Проверка установки | python -c "import flask; print(flask.__version__)" | python3 -c "import flask; print(flask.__version__)" |
После активации виртуального окружения вы заметите, что в командной строке появился префикс (venv). Это означает, что виртуальное окружение активно, и все пакеты будут устанавливаться только в него, не затрагивая глобальную установку Python.
Для тех, кто использует VS Code или PyCharm, рекомендую настроить интерпретатор в настройках редактора, указав путь к Python из вашего виртуального окружения. Это обеспечит правильную работу автодополнения и подсветки синтаксиса.
Дмитрий Волков, Преподаватель курсов программирования
На моём первом занятии по Flask половина группы застряла именно на этапе настройки окружения. Одна студентка, Марина, час пыталась понять, почему у неё не работает импорт Flask, хотя пакет был установлен. Оказалось, она установила его глобально, а запускала проект внутри виртуального окружения.
Поэтому теперь я всегда начинаю обучение с создания файла requirements.txt, даже для самых простых проектов:
- Создаём файл requirements.txt с содержимым:
flask==2.3.3
- Устанавливаем всё сразу:
pip install -r requirements.txt- Фиксируем версии:
pip freeze > requirements.txtТакой подход гарантирует, что у всех студентов будет одинаковое окружение, и мы тратим время на программирование, а не на отладку странных ошибок.
После установки Flask можно создать минимальный файл app.py для проверки работоспособности:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Привет, мир! Flask работает!'
if __name__ == '__main__':
app.run(debug=True)
Теперь запустите этот файл командой python app.py (или python3 app.py на macOS/Linux), и перейдите в браузере по адресу http://127.0.0.1:5000/. Если вы видите сообщение "Привет, мир! Flask работает!", значит окружение настроено правильно. 🎉
Создание первого приложения на Flask: маршруты и базовые функции
Теперь, когда окружение настроено, давайте создадим полноценное приложение на Flask. Мы построим простой блог, где можно просматривать статьи. Это позволит нам изучить основы маршрутизации и структуры Flask-приложения.
Начнем с обновления нашего файла app.py:
from flask import Flask, render_template
app = Flask(__name__)
# Имитация базы данных
posts = [
{
'id': 1,
'title': 'Первые шаги с Flask',
'content': 'Flask — это микрофреймворк для Python...',
'author': 'Иван Петров',
'date_posted': '20.10.2023'
},
{
'id': 2,
'title': 'Работа с базами данных в Flask',
'content': 'SQLAlchemy — мощный инструмент для...',
'author': 'Мария Сидорова',
'date_posted': '22.10.2023'
}
]
@app.route('/')
@app.route('/home')
def home():
return render_template('home.html', posts=posts, title='Главная')
@app.route('/about')
def about():
return render_template('about.html', title='О нас')
@app.route('/post/<int:post_id>')
def post(post_id):
post = next((p for p in posts if p['id'] == post_id), None)
return render_template('post.html', post=post, title=post['title'] if post else 'Статья не найдена')
if __name__ == '__main__':
app.run(debug=True)
Теперь создадим структуру директорий для нашего проекта:
- 📁 project_folder/
- 📄 app.py
- 📁 templates/
- 📄 layout.html
- 📄 home.html
- 📄 about.html
- 📄 post.html
- 📁 static/
- 📁 css/
- 📄 main.css
Создадим базовый шаблон layout.html в папке templates:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title if title else 'Flask Blog' }}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
</head>
<body>
<header>
<nav>
<div class="logo">Flask Blog</div>
<ul class="nav-links">
<li><a href="{{ url_for('home') }}">Главная</a></li>
<li><a href="{{ url_for('about') }}">О нас</a></li>
</ul>
</nav>
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
<p>© 2023 Flask Blog</p>
</footer>
</body>
</html>
Теперь создадим шаблон home.html:
{% extends "layout.html" %}
{% block content %}
<h1>Наши статьи</h1>
{% for post in posts %}
<article class="post">
<h2><a href="{{ url_for('post', post_id=post.id) }}">{{ post.title }}</a></h2>
<p class="post-info">Автор: {{ post.author }} | {{ post.date_posted }}</p>
<p class="post-content">{{ post.content[:100] }}...</p>
<a class="read-more" href="{{ url_for('post', post_id=post.id) }}">Читать дальше</a>
</article>
{% endfor %}
{% endblock %}
Шаблон about.html:
{% extends "layout.html" %}
{% block content %}
<h1>О нашем блоге</h1>
<p>Этот блог создан с использованием Python и Flask в учебных целях.</p>
{% endblock %}
И шаблон post.html:
{% extends "layout.html" %}
{% block content %}
{% if post %}
<article class="single-post">
<h1>{{ post.title }}</h1>
<p class="post-info">Автор: {{ post.author }} | {{ post.date_posted }}</p>
<div class="post-content">
<p>{{ post.content }}</p>
</div>
<a href="{{ url_for('home') }}" class="back-button">← Назад к статьям</a>
</article>
{% else %}
<div class="error">
<h1>Упс! Статья не найдена</h1>
<p>Возможно, она была удалена или вы перешли по неправильной ссылке.</p>
<a href="{{ url_for('home') }}" class="back-button">← Вернуться на главную</a>
</div>
{% endif %}
{% endblock %}
Наконец, создадим простой CSS-файл main.css в папке static/css:
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 800px;
margin: 0 auto;
padding: 0 20px;
}
header {
padding: 20px 0;
border-bottom: 1px solid #eee;
}
nav {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 1.5em;
font-weight: bold;
}
.nav-links {
display: flex;
list-style: none;
}
.nav-links li {
margin-left: 20px;
}
.nav-links a {
text-decoration: none;
color: #333;
}
main {
padding: 20px 0;
min-height: calc(100vh – 180px);
}
h1 {
margin-bottom: 20px;
}
.post {
margin-bottom: 30px;
padding-bottom: 20px;
border-bottom: 1px solid #eee;
}
.post h2 a {
text-decoration: none;
color: #333;
}
.post-info {
color: #777;
font-size: 0.9em;
margin-bottom: 10px;
}
.read-more {
display: inline-block;
margin-top: 10px;
color: #0066cc;
text-decoration: none;
}
footer {
text-align: center;
padding: 20px 0;
color: #777;
border-top: 1px solid #eee;
}
После создания всех этих файлов, запустите приложение командой python app.py и откройте http://127.0.0.1:5000/ в браузере. Вы должны увидеть работающий блог с главной страницей, списком статей и возможностью перехода к отдельным статьям. 📝
Разберем ключевые компоненты нашего приложения:
- Маршруты – они определяются декоратором
@app.route()и связывают URL с функцией-обработчиком - Динамические маршруты –
/post/<int:post_id>позволяет получать параметр из URL - Функции представления – функции Python, которые обрабатывают запросы
- Шаблоны – HTML-файлы с возможностью вставки динамического содержимого
- Статические файлы – CSS, JavaScript и изображения хранятся в папке
static
Обработка запросов в Flask: GET, POST и работа с формами
До сих пор наше приложение только отображало информацию. Давайте добавим возможность создавать новые статьи через веб-форму. Это позволит нам изучить обработку разных типов HTTP-запросов и взаимодействие с формами. 📮
Сначала обновим наш app.py, добавив необходимые импорты и новые маршруты:
from flask import Flask, render_template, request, redirect, url_for, flash
from datetime import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key' # Нужен для работы flash-сообщений
# Имитация базы данных
posts = [
{
'id': 1,
'title': 'Первые шаги с Flask',
'content': 'Flask — это микрофреймворк для Python...',
'author': 'Иван Петров',
'date_posted': '20.10.2023'
},
{
'id': 2,
'title': 'Работа с базами данных в Flask',
'content': 'SQLAlchemy — мощный инструмент для...',
'author': 'Мария Сидорова',
'date_posted': '22.10.2023'
}
]
# Существующие маршруты...
@app.route('/create', methods=['GET', 'POST'])
def create_post():
if request.method == 'POST':
# Получаем данные из формы
title = request.form.get('title')
content = request.form.get('content')
author = request.form.get('author')
# Валидация данных
if not title or not content or not author:
flash('Пожалуйста, заполните все поля', 'danger')
return render_template('create_post.html', title='Новая статья',
form_data={'title': title, 'content': content, 'author': author})
# Создаем новый пост
new_id = max(post['id'] for post in posts) + 1
post = {
'id': new_id,
'title': title,
'content': content,
'author': author,
'date_posted': datetime.now().strftime('%d.%m.%Y')
}
posts.append(post)
flash('Статья успешно создана!', 'success')
return redirect(url_for('post', post_id=new_id))
# GET запрос – просто показываем форму
return render_template('create_post.html', title='Новая статья')
if __name__ == '__main__':
app.run(debug=True)
Теперь создадим шаблон create_post.html в папке templates:
{% extends "layout.html" %}
{% block content %}
<h1>Создать новую статью</h1>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert alert-{{ category }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
<form method="POST" class="post-form">
<div class="form-group">
<label for="title">Заголовок</label>
<input type="text" id="title" name="title" required
value="{{ form_data.title if form_data else '' }}">
</div>
<div class="form-group">
<label for="author">Автор</label>
<input type="text" id="author" name="author" required
value="{{ form_data.author if form_data else '' }}">
</div>
<div class="form-group">
<label for="content">Содержание</label>
<textarea id="content" name="content" rows="10" required>{{ form_data.content if form_data else '' }}</textarea>
</div>
<button type="submit" class="submit-btn">Опубликовать</button>
</form>
{% endblock %}
Также обновим layout.html, добавив ссылку на страницу создания статьи и поддержку flash-сообщений:
<!DOCTYPE html>
<html lang="ру">
<head>
<!-- ... (остальной код остается без изменений) ... -->
</head>
<body>
<header>
<nav>
<div class="logo">Flask Blog</div>
<ul class="nav-links">
<li><a href="{{ url_for('home') }}">Главная</a></li>
<li><a href="{{ url_for('create_post') }}">Создать статью</a></li>
<li><a href="{{ url_for('about') }}">О нас</a></li>
</ul>
</nav>
</header>
<main>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert alert-{{ category }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</main>
<!-- ... (остальной код остается без изменений) ... -->
</body>
</html>
Наконец, добавим стили для формы и уведомлений в наш main.css:
/* ... существующие стили ... */
.post-form {
margin: 20px 0;
}
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
.form-group input,
.form-group textarea {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
}
.submit-btn {
background-color: #0066cc;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
.submit-btn:hover {
background-color: #0055aa;
}
.alert {
padding: 10px;
margin-bottom: 20px;
border-radius: 4px;
}
.alert-success {
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.alert-danger {
background-color: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
Запустите приложение и перейдите на страницу http://127.0.0.1:5000/create, чтобы создать новую статью. После заполнения формы и отправки вы будете перенаправлены на страницу созданной статьи. 🚀
Давайте разберем, как работает обработка запросов в Flask:
| Тип запроса | Когда используется | Как получить данные |
|---|---|---|
| GET | Для получения данных | request.args.get('param') |
| POST | Для отправки данных формы | request.form.get('field') |
| PUT | Для обновления ресурса | request.json (для API) |
| DELETE | Для удаления ресурса | Обычно не содержит данных |
В нашем примере маршрут /create обрабатывает два типа запросов:
- GET — когда пользователь переходит на страницу создания статьи, мы просто показываем форму
- POST — когда пользователь отправляет форму, мы получаем данные из
request.form, проверяем их и создаем новую статью
Также мы используем несколько важных функций Flask:
- redirect — перенаправляет пользователя на другую страницу
- url_for — генерирует URL для маршрута по имени функции
- flash — создает всплывающие сообщения, которые будут показаны на следующей странице
Продвинутые возможности Flask-сервера: шаблоны и база данных
Наше приложение уже имеет базовую функциональность, но оно использует список в памяти вместо настоящей базы данных, а работа с шаблонами пока довольно примитивна. Давайте улучшим наш блог, подключив SQLite базу данных с помощью SQLAlchemy и расширив возможности шаблонов. 💾
Сначала установим необходимые пакеты:
pip install flask-sqlalchemy
Теперь переработаем наш app.py, добавив поддержку базы данных:
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# Модели базы данных
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
author = db.Column(db.String(50), nullable=False)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
def __repr__(self):
return f"Post('{self.title}', '{self.date_posted}')"
# Создание базы данных
with app.app_context():
db.create_all()
# Добавление начальных данных, если база пуста
if not Post.query.first():
sample_posts = [
Post(title='Первые шаги с Flask',
content='Flask — это микрофреймворк для Python...',
author='Иван Петров',
date_posted=datetime.strptime('20.10.2023', '%d.%m.%Y')),
Post(title='Работа с базами данных в Flask',
content='SQLAlchemy — мощный инструмент для...',
author='Мария Сидорова',
date_posted=datetime.strptime('22.10.2023', '%d.%m.%Y'))
]
db.session.add_all(sample_posts)
db.session.commit()
@app.route('/')
@app.route('/home')
def home():
posts = Post.query.order_by(Post.date_posted.desc()).all()
return render_template('home.html', posts=posts, title='Главная')
@app.route('/about')
def about():
return render_template('about.html', title='О нас')
@app.route('/post/<int:post_id>')
def post(post_id):
post = Post.query.get_or_404(post_id)
return render_template('post.html', post=post, title=post.title)
@app.route('/create', methods=['GET', 'POST'])
def create_post():
if request.method == 'POST':
title = request.form.get('title')
content = request.form.get('content')
author = request.form.get('author')
if not title or not content or not author:
flash('Пожалуйста, заполните все поля', 'danger')
return render_template('create_post.html', title='Новая статья',
form_data={'title': title, 'content': content, 'author': author})
post = Post(title=title, content=content, author=author)
db.session.add(post)
db.session.commit()
flash('Статья успешно создана!', 'success')
return redirect(url_for('post', post_id=post.id))
return render_template('create_post.html', title='Новая статья')
@app.route('/post/<int:post_id>/update', methods=['GET', 'POST'])
def update_post(post_id):
post = Post.query.get_or_404(post_id)
if request.method == 'POST':
post.title = request.form.get('title')
post.content = request.form.get('content')
post.author = request.form.get('author')
db.session.commit()
flash('Статья успешно обновлена!', 'success')
return redirect(url_for('post', post_id=post.id))
return render_template('update_post.html', title='Редактирование статьи', post=post)
@app.route('/post/<int:post_id>/delete', methods=['POST'])
def delete_post(post_id):
post = Post.query.get_or_404(post_id)
db.session.delete(post)
db.session.commit()
flash('Статья удалена!', 'success')
return redirect(url_for('home'))
if __name__ == '__main__':
app.run(debug=True)
Теперь нужно обновить наши шаблоны для поддержки редактирования и удаления статей. Создадим новый шаблон update_post.html:
{% extends "layout.html" %}
{% block content %}
<h1>Редактировать статью</h1>
<form method="POST" class="post-form">
<div class="form-group">
<label for="title">Заголовок</label>
<input type="text" id="title" name="title" required value="{{ post.title }}">
</div>
<div class="form-group">
<label for="author">Автор</label>
<input type="text" id="author" name="author" required value="{{ post.author }}">
</div>
<div class="form-group">
<label for="content">Содержание</label>
<textarea id="content" name="content" rows="10" required>{{ post.content }}</textarea>
</div>
<button type="submit" class="submit-btn">Сохранить изменения</button>
<a href="{{ url_for('post', post_id=post.id) }}" class="cancel-btn">Отмена</a>
</form>
{% endblock %}
Обновим шаблон post.html для добавления кнопок редактирования и удаления:
{% extends "layout.html" %}
{% block content %}
{% if post %}
<article class="single-post">
<h1>{{ post.title }}</h1>
<p class="post-info">Автор: {{ post.author }} | {{ post.date_posted.strftime('%d.%m.%Y') }}</p>
<div class="post-content">
<p>{{ post.content }}</p>
</div>
<div class="post-actions">
<a href="{{ url_for('update_post', post_id=post.id) }}" class="edit-btn">Редактировать</a>
<form method="POST" action="{{ url_for('delete_post', post_id=post.id) }}" class="delete-form">
<button type="submit" class="delete-btn" onclick="return confirm('Вы уверены, что хотите удалить эту статью?')">Удалить</button>
</form>
</div>
<a href="{{ url_for('home') }}" class="back-button">← Назад к статьям</a>
</article>
{% else %}
<div class="error">
<h1>Упс! Статья не найдена</h1>
<p>Возможно, она была удалена или вы перешли по неправильной ссылке.</p>
<a href="{{ url_for('home') }}" class="back-button">← Вернуться на главную</a>
</div>
{% endif %}
{% endblock %}
Также нужно обновить home.html, чтобы он корректно работал с объектами из базы данных:
{% extends "layout.html" %}
{% block content %}
<h1>Наши статьи</h1>
{% for post in posts %}
<article class="post">
<h2><a href="{{ url_for('post', post_id=post.id) }}">{{ post.title }}</a></h2>
<p class="post-info">Автор: {{ post.author }} | {{ post.date_posted.strftime('%d.%m.%Y') }}</p>
<p class="post-content">{{ post.content[:100] }}...</p>
<a class="read-more" href="{{ url_for('post', post_id=post.id) }}">Читать дальше</a>
</article>
{% endfor %}
{% endblock %}
Добавим новые стили в main.css:
/* ... существующие стили ... */
.post-actions {
margin: 20px 0;
}
.edit-btn, .cancel-btn {
display: inline-block;
padding: 8px 16px;
background-color: #5bc0de;
color: white;
text-decoration: none;
border-radius: 4px;
margin-right: 10px;
}
.delete-btn {
padding: 8px 16px;
background-color: #d9534f;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.delete-form {
display: inline;
}
.cancel-btn {
background-color: #f0ad4e;
}
Теперь наше приложение использует базу данных SQLite с помощью SQLAlchemy и поддерживает полный набор операций CRUD (Create, Read, Update, Delete). 📊
Рассмотрим основные компоненты нашей обновленной системы:
- Модели — классы Python, которые представляют таблицы в базе данных
- ORM (Object-Relational Mapping) — позволяет работать с базой данных через объекты Python
- Миграции — для более сложных приложений рекомендуется использовать Flask-Migrate для управления изменениями схемы базы данных
- Защита от ошибок — метод
get_or_404автоматически возвращает ошибку 404, если запись не найдена
Дополнительные возможности, которые вы можете добавить в приложение:
- Аутентификация пользователей — с помощью Flask-Login
- Пагинация — разбиение списка статей на страницы
- Поиск — добавление формы поиска по заголовкам и содержимому
- API — создание RESTful API с помощью Flask-RESTful
- Загрузка файлов — возможность добавлять изображения к статьям
Создание сервера на Flask — отличная точка входа в мир веб-разработки на Python. Мы прошли путь от простого "Hello World" до полноценного блога с базой данных и CRUD-операциями. Следующим шагом может быть добавление аутентификации пользователей, API или интеграция с фронтенд-фреймворками. Помните: Flask дает вам свободу выбора компонентов и архитектуры, что делает его идеальным как для учебных проектов, так и для серьезных приложений. Не бойтесь экспериментировать — лучший способ научиться программированию — это писать код и решать реальные задачи.