Flask и Python для веб-серверов: пошаговая инструкция создания

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Новички в веб-разработке, желающие освоить основы работы с 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-приложения необходимо настроить рабочее окружение. Я рекомендую использовать виртуальное окружение для каждого проекта — это позволит избежать конфликтов между зависимостями разных проектов. 🔧

Вот пошаговое руководство по настройке среды разработки:

  1. Убедитесь, что Python установлен на вашем компьютере (рекомендуется версия 3.8 и выше)
  2. Создайте новую директорию для вашего проекта
  3. Откройте терминал и перейдите в эту директорию
  4. Создайте виртуальное окружение
  5. Активируйте виртуальное окружение
  6. Установите Flask через pip
  7. Проверьте установку

Давайте рассмотрим эти шаги подробнее с конкретными командами для разных операционных систем.

Шаг 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, даже для самых простых проектов:

  1. Создаём файл requirements.txt с содержимым:
flask==2.3.3

  1. Устанавливаем всё сразу: pip install -r requirements.txt
  2. Фиксируем версии: 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>&copy; 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, если запись не найдена

Дополнительные возможности, которые вы можете добавить в приложение:

  1. Аутентификация пользователей — с помощью Flask-Login
  2. Пагинация — разбиение списка статей на страницы
  3. Поиск — добавление формы поиска по заголовкам и содержимому
  4. API — создание RESTful API с помощью Flask-RESTful
  5. Загрузка файлов — возможность добавлять изображения к статьям

Создание сервера на Flask — отличная точка входа в мир веб-разработки на Python. Мы прошли путь от простого "Hello World" до полноценного блога с базой данных и CRUD-операциями. Следующим шагом может быть добавление аутентификации пользователей, API или интеграция с фронтенд-фреймворками. Помните: Flask дает вам свободу выбора компонентов и архитектуры, что делает его идеальным как для учебных проектов, так и для серьезных приложений. Не бойтесь экспериментировать — лучший способ научиться программированию — это писать код и решать реальные задачи.

Загрузка...