200 вопросов по Django и Flask
200 вопросов по Django и Flask
Основы веб-разработки и WSGI
Вопрос
Что такое WSGI?
Ответ
WSGI (Web Server Gateway Interface) — это спецификация взаимодействия между веб-сервером и Python-приложением или фреймворком. Она определяет стандартный способ передачи HTTP-запросов от сервера к приложению и возврата ответов обратно клиенту. Flask и Django совместимы с WSGI и могут развертываться через WSGI-серверы, такие как Gunicorn или uWSGI.
Вопрос
Как Flask обрабатывает HTTP-запрос?
Ответ
Flask использует встроенный WSGI-сервер (для разработки) или внешний WSGI-сервер (в продакшене). При получении запроса Flask сопоставляет URL с зарегистрированными маршрутами (view-функциями), извлекает параметры, вызывает соответствующую функцию и возвращает её результат как HTTP-ответ.
Вопрос
Как Django обрабатывает HTTP-запрос?
Ответ
Django принимает запрос через WSGI-интерфейс, создаёт объект HttpRequest, пропускает его через middleware, определяет соответствующий view с помощью URLconf, вызывает view, который возвращает объект HttpResponse, и отправляет его клиенту.
Вопрос
Что такое middleware в контексте веб-фреймворков?
Ответ
Middleware — это компонент, который обрабатывает запрос до того, как он достигнет view, и/или обрабатывает ответ после того, как он создан view. В Django middleware реализуется как класс с методами process_request и process_response. В Flask аналогичную роль играют декораторы @app.before_request и @app.after_request.
Вопрос
В чём разница между development- и production-сервером в Flask?
Ответ
Development-сервер Flask (flask run) встроен в фреймворк, не предназначен для продакшена, не масштабируется и не безопасен. Production-сервер — это внешний WSGI-сервер (например, Gunicorn), который обеспечивает производительность, многопоточность и отказоустойчивость.
Установка и настройка
Вопрос
Как установить Flask?
Ответ
Flask устанавливается через pip:
pip install Flask
Вопрос
Как установить Django?
Ответ
Django устанавливается через pip:
pip install Django
Вопрос
Как создать новое Django-приложение?
Ответ
Сначала создаётся проект:
django-admin startproject myproject
Затем внутри проекта создаётся приложение:
python manage.py startapp myapp
Вопрос
Как запустить сервер разработки в Flask?
Ответ
Создаётся файл app.py, например:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello"
if __name__ == '__main__':
app.run(debug=True)
Запуск:
python app.py
Вопрос
Как запустить сервер разработки в Django?
Ответ
После создания проекта выполняется команда:
python manage.py runserver
Маршрутизация и view-функции
Вопрос
Как определить маршрут в Flask?
Ответ
Маршрут определяется с помощью декоратора @app.route:
@app.route('/user/<username>')
def show_user(username):
return f'User: {username}'
Вопрос
Как определить маршрут в Django?
Ответ
Маршрут определяется в файле urls.py с использованием функции path или re_path:
from django.urls import path
from . import views
urlpatterns = [
path('user/<str:username>/', views.show_user, name='show_user'),
]
Вопрос
Какие типы конвертеров пути существуют в Django?
Ответ
Django предоставляет встроенные конвертеры:
str— любая непустая строка без/,int— целое число,slug— буквенно-цифровая строка с дефисами и подчёркиваниями,uuid— UUID в формате строки,path— любая непустая строка, включая/.
Вопрос
Как передать параметры в URL в Flask?
Ответ
Параметры указываются в маршруте в угловых скобках. Можно задать тип:
@app.route('/post/<int:post_id>')
def post(post_id):
return f'Post ID: {post_id}'
Вопрос
Как получить GET-параметры в Flask?
Ответ
GET-параметры доступны через request.args:
from flask import request
@app.route('/search')
def search():
q = request.args.get('q', '')
return f'Search for: {q}'
Вопрос
Как получить GET-параметры в Django?
Ответ
GET-параметры доступны через атрибут GET объекта HttpRequest:
def search(request):
q = request.GET.get('q', '')
return HttpResponse(f'Search for: {q}')
Вопрос
Что такое именованный маршрут (named URL) в Django?
Ответ
Именованный маршрут — это маршрут с параметром name в path(). Он позволяет ссылаться на URL по имени, а не по жёсткой строке, что упрощает рефакторинг:
path('article/<int:id>/', views.article, name='article_detail')
Обратное разрешение выполняется функцией reverse() или тегом {% url %} в шаблонах.
Вопрос
Как реализовать перенаправление в Flask?
Ответ
Перенаправление выполняется с помощью функции redirect:
from flask import redirect, url_for
@app.route('/old')
def old():
return redirect(url_for('new'))
@app.route('/new')
def new():
return 'New page'
Вопрос
Как реализовать перенаправление в Django?
Ответ
Перенаправление выполняется с помощью функции redirect:
from django.shortcuts import redirect
def old_view(request):
return redirect('new_view_name')
Вопрос
Что делает декоратор @app.errorhandler в Flask?
Ответ
Декоратор @app.errorhandler регистрирует функцию для обработки ошибок HTTP определённого кода, например 404 или 500:
@app.errorhandler(404)
def not_found(e):
return "Page not found", 404
Шаблоны и рендеринг
Вопрос
Как Flask рендерит HTML-шаблоны?
Ответ
Flask использует движок шаблонов Jinja2. Для рендеринга шаблона применяется функция render_template, которая принимает имя файла шаблона и контекстные переменные:
from flask import render_template
@app.route('/')
def index():
return render_template('index.html', name='World')
Вопрос
Как Django рендерит HTML-шаблоны?
Ответ
Django использует собственный шаблонный язык. Для рендеринга применяется функция render, которая принимает объект запроса, путь к шаблону и словарь контекста:
from django.shortcuts import render
def index(request):
return render(request, 'index.html', {'name': 'World'})
Вопрос
Где по умолчанию Django ищет шаблоны?
Ответ
Django ищет шаблоны в каталогах, указанных в настройке TEMPLATES['DIRS'], а также в подкаталогах templates внутри каждого установленного приложения (INSTALLED_APPS).
Вопрос
Где по умолчанию Flask ищет шаблоны?
Ответ
Flask ищет шаблоны в подкаталоге templates, расположенном в той же директории, где находится основной файл приложения.
Вопрос
Как передать переменную в шаблон во Flask?
Ответ
Переменные передаются как именованные аргументы в функцию render_template:
return render_template('profile.html', username='alice', age=30)
Вопрос
Как передать переменную в шаблон в Django?
Ответ
Переменные передаются через словарь контекста в функцию render:
return render(request, 'profile.html', {'username': 'alice', 'age': 30})
Вопрос
Что такое наследование шаблонов в Jinja2/Django?
Ответ
Наследование шаблонов — это механизм, позволяющий создавать базовый шаблон с общей структурой (например, <html>, <head>, навигация), а дочерние шаблоны определяют только изменяющиеся блоки.
В Jinja2 используется {% extends "base.html" %} и {% block content %}...{% endblock %}.
В Django синтаксис аналогичен.
Вопрос
Как включить один шаблон в другой во Flask?
Ответ
Используется тег {% include "partial.html" %} в Jinja2. Это вставляет содержимое partial.html в текущее место шаблона.
Вопрос
Как включить один шаблон в другой в Django?
Ответ
Используется тег {% include "partial.html" %} в шаблоне Django. Он вставляет содержимое указанного шаблона в текущую позицию.
Вопрос
Поддерживает ли Django другие шаблонные движки, кроме своего?
Ответ
Да. Django позволяет настраивать несколько шаблонных движков через параметр TEMPLATES в settings.py. Можно использовать Jinja2, если явно указать его в конфигурации.
Работа с формами
Вопрос
Как обработать POST-запрос во Flask?
Ответ
Проверяется метод запроса через request.method:
from flask import request
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
name = request.form['name']
return f"Hello, {name}"
return render_template('form.html')
Вопрос
Как обработать POST-запрос в Django?
Ответ
Проверяется метод запроса через request.method:
def submit(request):
if request.method == 'POST':
name = request.POST.get('name')
return HttpResponse(f"Hello, {name}")
return render(request, 'form.html')
Вопрос
Что такое CSRF-токен и зачем он нужен?
Ответ
CSRF-токен — это уникальный секретный ключ, встроенный в форму, который защищает приложение от межсайтовой подделки запросов. При отправке формы сервер проверяет, совпадает ли токен с ожидаемым значением.
Вопрос
Как добавить CSRF-защиту в форму Django?
Ответ
В шаблоне формы используется тег {% csrf_token %}:
<form method="post">
{% csrf_token %}
<input name="name">
<button type="submit">Send</button>
</form>
Вопрос
Как добавить CSRF-защиту в Flask?
Ответ
Flask не включает CSRF-защиту по умолчанию. Для этого используется расширение Flask-WTF, которое предоставляет декоратор @csrf_protect и форму с автоматической генерацией токена.
Вопрос
Что такое WTForms?
Ответ
WTForms — это библиотека Python для создания, валидации и обработки веб-форм. Она используется в Flask через расширение Flask-WTF.
Вопрос
Как создать форму с валидацией в Flask с помощью Flask-WTF?
Ответ
Определяется класс формы, наследуемый от FlaskForm, с полями и валидаторами:
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class NameForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
submit = SubmitField('Submit')
Вопрос
Как использовать эту форму во view?
Ответ
Форма создаётся в view, проверяется методом validate_on_submit(), и данные извлекаются из её полей:
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
name = form.name.data
return f"Hello, {name}"
return render_template('index.html', form=form)
Вопрос
Что такое Django Forms?
Ответ
Django Forms — это встроенный механизм для определения, отображения и валидации форм. Формы могут быть привязаны к модели (ModelForm) или существовать независимо (Form).
Вопрос
Как создать простую форму в Django?
Ответ
Определяется класс, наследуемый от forms.Form:
from django import forms
class NameForm(forms.Form):
name = forms.CharField(max_length=100)
Сессии и cookies
Вопрос
Как работают сессии во Flask?
Ответ
Flask предоставляет объект session, который хранит данные на стороне клиента в зашифрованном cookie. Для работы требуется установка SECRET_KEY:
app.secret_key = 'your-secret-key'
Вопрос
Как сохранить значение в сессии во Flask?
Ответ
Значение сохраняется как в словарь:
from flask import session
session['username'] = 'alice'
Вопрос
Как прочитать значение из сессии во Flask?
Ответ
Значение читается по ключу:
username = session.get('username')
Вопрос
Как удалить значение из сессии во Flask?
Ответ
Используется оператор del или метод pop:
session.pop('username', None)
Вопрос
Где хранятся сессии по умолчанию в Django?
Ответ
По умолчанию Django хранит сессии в базе данных (таблица django_session). Также возможны другие бэкенды: файлы, кэш, cookies.
Вопрос
Как сохранить значение в сессии в Django?
Ответ
Сессия доступна через атрибут request.session, который ведёт себя как словарь:
request.session['username'] = 'alice'
Вопрос
Как прочитать значение из сессии в Django?
Ответ
Значение читается по ключу:
username = request.session.get('username')
Вопрос
Как удалить значение из сессии в Django?
Ответ
Используется del или pop:
request.session.pop('username', None)
Вопрос
Что такое cookie?
Ответ
Cookie — это небольшой фрагмент данных, отправляемый сервером браузеру и сохраняемый им. При последующих запросах браузер автоматически отправляет cookie обратно на сервер.
Вопрос
Как установить cookie во Flask?
Ответ
Используется объект Response и метод set_cookie:
from flask import make_response
@app.route('/set')
def set_cookie():
resp = make_response("Cookie set")
resp.set_cookie('theme', 'dark')
return resp
Работа с базами данных
Вопрос
Какой уровень абстракции над базой данных предоставляют Django и Flask?
Ответ
Django предоставляет встроенный ORM (Object-Relational Mapper). Flask не имеет встроенного ORM, но часто используется с SQLAlchemy — мощной библиотекой для работы с базами данных.
Вопрос
Что такое ORM?
Ответ
ORM (Object-Relational Mapper) — это инструмент, который позволяет взаимодействовать с базой данных через объекты Python, а не через SQL-запросы. Он преобразует операции с объектами в соответствующие SQL-команды.
Вопрос
Поддерживает ли Django несколько баз данных?
Ответ
Да. Django поддерживает настройку нескольких баз данных через параметр DATABASES в settings.py и позволяет указывать, какую базу использовать для конкретных запросов или моделей.
Вопрос
Как подключить базу данных в Flask?
Ответ
Flask не управляет подключением к базе напрямую. Обычно используется расширение, например Flask-SQLAlchemy, которое настраивается через URI:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
Вопрос
Какие СУБД поддерживает Django «из коробки»?
Ответ
Django официально поддерживает PostgreSQL, MySQL, SQLite и Oracle. Для других СУБД существуют сторонние бэкенды.
ORM в Django
Вопрос
Как определить модель в Django?
Ответ
Модель определяется как класс, наследуемый от django.db.models.Model. Поля модели задаются как атрибуты класса:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
published = models.DateTimeField(auto_now_add=True)
Вопрос
Что делает команда makemigrations?
Ответ
Команда python manage.py makemigrations анализирует изменения в файлах моделей и создаёт файлы миграций — Python-скрипты, описывающие, как изменить структуру базы данных.
Вопрос
Что делает команда migrate?
Ответ
Команда python manage.py migrate применяет неприменённые миграции к базе данных, изменяя её структуру в соответствии с текущими моделями.
Вопрос
Как создать запись в базе данных через Django ORM?
Ответ
Создаётся экземпляр модели и вызывается метод save():
article = Article(title="My Title")
article.save()
Вопрос
Как получить все записи из таблицы в Django?
Ответ
Используется менеджер objects.all():
articles = Article.objects.all()
Вопрос
Как отфильтровать записи в Django ORM?
Ответ
Используется метод filter():
published_articles = Article.objects.filter(published__year=2025)
Вопрос
Как получить одну запись по условию в Django?
Ответ
Используется метод get(). Он возвращает один объект или вызывает исключение, если объект не найден или найдено больше одного:
article = Article.objects.get(id=1)
Вопрос
Как обновить запись в Django ORM?
Ответ
Запись загружается, изменяются поля, вызывается save():
article = Article.objects.get(id=1)
article.title = "New Title"
article.save()
Вопрос
Как удалить запись в Django ORM?
Ответ
Вызывается метод delete() у экземпляра модели:
article = Article.objects.get(id=1)
article.delete()
Вопрос
Что такое QuerySet?
Ответ
QuerySet — это коллекция объектов из базы данных. Он ленив: запрос к БД выполняется только при итерации, преобразовании в список или вызове методов вроде count().
Вопрос
Как выполнить сырой SQL-запрос в Django?
Ответ
Используется метод raw() менеджера модели или connection.cursor():
articles = Article.objects.raw('SELECT * FROM myapp_article WHERE id = %s', [1])
Вопрос
Что такое select_related?
Ответ
select_related — это оптимизация, которая выполняет JOIN при запросе, чтобы избежать дополнительных запросов при доступе к связанным объектам через ForeignKey.
Вопрос
Что такое prefetch_related?
Ответ
prefetch_related — это оптимизация, которая выполняет отдельный запрос для связанных объектов (например, ManyToManyField) и кэширует их, предотвращая N+1 проблему.
Вопрос
Как добавить индекс к полю модели в Django?
Ответ
Используется параметр db_index=True в определении поля или класс Meta с атрибутом indexes:
class Article(models.Model):
title = models.CharField(max_length=200, db_index=True)
Вопрос
Что делает auto_now_add=True в поле DateTimeField?
Ответ
Поле автоматически получает текущую дату и время при первом сохранении объекта в базу данных.
SQLAlchemy в Flask
Вопрос
Что такое SQLAlchemy?
Ответ
SQLAlchemy — это библиотека Python для работы с реляционными базами данных. Она предоставляет как высокоуровневый ORM, так и низкоуровневый SQL-выражения (Core).
Вопрос
Как инициализировать SQLAlchemy в Flask?
Ответ
Создаётся экземпляр SQLAlchemy, привязанный к приложению:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
db.init_app(app)
Вопрос
Как определить модель в Flask с использованием SQLAlchemy?
Ответ
Модель наследуется от db.Model, поля определяются как атрибуты:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
Вопрос
Как создать таблицы в базе данных через SQLAlchemy?
Ответ
Вызывается метод db.create_all(), обычно после настройки приложения:
with app.app_context():
db.create_all()
Вопрос
Как добавить запись в базу через SQLAlchemy?
Ответ
Создаётся экземпляр модели, добавляется в сессию и фиксируется:
user = User(username='alice')
db.session.add(user)
db.session.commit()
Вопрос
Как получить все записи через SQLAlchemy?
Ответ
Используется запрос через модель:
users = User.query.all()
Вопрос
Как отфильтровать записи в SQLAlchemy?
Ответ
Используется метод filter():
user = User.query.filter(User.username == 'alice').first()
Вопрос
Как обновить запись в SQLAlchemy?
Ответ
Загружается объект, изменяются поля, вызывается commit():
user = User.query.get(1)
user.username = 'bob'
db.session.commit()
Вопрос
Как удалить запись в SQLAlchemy?
Ответ
Вызывается delete() на сессии:
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
Вопрос
Что такое сессия в SQLAlchemy?
Ответ
Сессия — это объект, управляющий транзакциями и состоянием объектов. Все операции с базой данных (добавление, изменение, удаление) проходят через сессию.
Аутентификация и авторизация
Вопрос
Как Django реализует аутентификацию пользователей?
Ответ
Django предоставляет встроенную систему аутентификации через модуль django.contrib.auth. Она включает модели User, функции authenticate() и login(), а также middleware и view-функции для входа, выхода и управления аккаунтами.
Вопрос
Как проверить, авторизован ли пользователь в Django?
Ответ
В view проверяется атрибут request.user.is_authenticated:
if request.user.is_authenticated:
# Пользователь вошёл в систему
Вопрос
Как выполнить вход пользователя в Django?
Ответ
Используются функции authenticate() и login():
from django.contrib.auth import authenticate, login
user = authenticate(username='alice', password='secret')
if user is not None:
login(request, user)
Вопрос
Как выполнить выход пользователя в Django?
Ответ
Используется функция logout():
from django.contrib.auth import logout
def logout_view(request):
logout(request)
return redirect('home')
Вопрос
Как защитить view от неавторизованных пользователей в Django?
Ответ
Применяется декоратор @login_required для функциональных view или миксин LoginRequiredMixin для классовых view:
from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
return render(request, 'profile.html')
Вопрос
Что такое суперпользователь в Django?
Ответ
Суперпользователь — это учётная запись с полными правами доступа к административной панели Django. Создаётся командой python manage.py createsuperuser.
Вопрос
Как работает система разрешений (permissions) в Django?
Ответ
Django автоматически создаёт разрешения для каждой модели (add, change, delete, view). Разрешения могут быть назначены пользователям или группам через админку или программно.
Вопрос
Как проверить наличие разрешения у пользователя в Django?
Ответ
Используется метод has_perm():
if request.user.has_perm('myapp.change_article'):
# Разрешено редактировать статьи
Вопрос
Поддерживает ли Flask встроенную систему аутентификации?
Ответ
Flask не имеет встроенной системы аутентификации. Для этих целей используются расширения, такие как Flask-Login, Flask-Security или собственная реализация.
Вопрос
Что делает расширение Flask-Login?
Ответ
Flask-Login управляет состоянием входа пользователя, предоставляет декоратор @login_required, объект current_user и обработчики для входа, выхода и защиты маршрутов.
Вопрос
Как инициализировать Flask-Login?
Ответ
Создаётся экземпляр LoginManager и определяется функция загрузки пользователя:
from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
Вопрос
Как выполнить вход пользователя в Flask с Flask-Login?
Ответ
Используется функция login_user():
from flask_login import login_user
user = User.query.filter_by(username='alice').first()
if user and user.check_password('secret'):
login_user(user)
Вопрос
Как проверить, авторизован ли пользователь в Flask?
Ответ
Проверяется атрибут current_user.is_authenticated:
from flask_login import current_user
if current_user.is_authenticated:
# Пользователь вошёл
Вопрос
Как защитить маршрут от неавторизованных пользователей в Flask?
Ответ
Применяется декоратор @login_required:
from flask_login import login_required
@app.route('/profile')
@login_required
def profile():
return f"Hello, {current_user.username}"
Вопрос
Как хранить пароли безопасно в Flask?
Ответ
Пароли хэшируются с помощью библиотеки werkzeug.security или passlib. Например:
from werkzeug.security import generate_password_hash, check_password_hash
hashed = generate_password_hash('secret')
valid = check_password_hash(hashed, 'secret')
Вопрос
Как хранить пароли безопасно в Django?
Ответ
Django автоматически хэширует пароли при сохранении через set_password() или при создании пользователя через create_user(). Хэширование использует PBKDF2 по умолчанию.
Вопрос
Что такое токен аутентификации?
Ответ
Токен аутентификации — это строка, выдаваемая сервером после успешного входа, которая используется клиентом для последующих запросов вместо логина и пароля.
Вопрос
Как реализовать токенную аутентификацию в Django?
Ответ
Используется пакет djangorestframework.authtoken. После установки и добавления 'rest_framework.authtoken' в INSTALLED_APPS, создаётся токен для каждого пользователя, и запросы защищаются заголовком Authorization: Token <key>.
Вопрос
Как реализовать токенную аутентификацию в Flask?
Ответ
Создаётся собственный механизм: при входе генерируется JWT или случайный токен, сохраняется в базе и проверяется при каждом запросе. Часто используется библиотека PyJWT для JWT.
Вопрос
Что такое JWT?
Ответ
JWT (JSON Web Token) — это стандарт токена, содержащий закодированную информацию о пользователе и сроке действия, подписанный секретным ключом. Он не требует хранения на сервере.
(Продолжаем без пауз)
REST API
Вопрос
Что такое REST API?
Ответ
REST API — это интерфейс взаимодействия между клиентом и сервером, основанный на HTTP-методах, ресурсах и представлениях в формате JSON или XML.
Вопрос
Как создать простой REST API в Flask?
Ответ
Возвращается JSON с помощью jsonify:
from flask import jsonify
@app.route('/api/user/<int:user_id>')
def get_user(user_id):
user = {'id': user_id, 'name': 'Alice'}
return jsonify(user)
Вопрос
Как обрабатывать разные HTTP-методы в Flask?
Ответ
Указываются допустимые методы в декораторе @app.route:
@app.route('/api/users', methods=['GET', 'POST'])
def users():
if request.method == 'POST':
# Создать пользователя
else:
# Вернуть список
Вопрос
Что такое Django REST Framework (DRF)?
Ответ
Django REST Framework — это мощное расширение для Django, упрощающее создание RESTful API. Оно предоставляет сериализаторы, viewsets, маршрутизацию, аутентификацию и документацию.
Вопрос
Что такое сериализатор в DRF?
Ответ
Сериализатор преобразует сложные типы данных (например, экземпляры модели Django) в нативные Python-типы, которые затем могут быть легко преобразованы в JSON. Также он выполняет валидацию входных данных.
Вопрос
Как определить сериализатор в DRF?
Ответ
Создаётся класс, наследуемый от serializers.Serializer или serializers.ModelSerializer:
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
Вопрос
Как создать view для API в DRF?
Ответ
Можно использовать функциональный view с декоратором @api_view, или классовый view, например APIView, GenericAPIView, или ModelViewSet.
Вопрос
Что делает ModelViewSet в DRF?
Ответ
ModelViewSet автоматически предоставляет действия list, create, retrieve, update, partial_update и destroy для модели, связанной с сериализатором.
Вопрос
Как зарегистрировать маршруты для ModelViewSet?
Ответ
Используется DefaultRouter:
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
urlpatterns = router.urls
Вопрос
Как добавить фильтрацию в DRF?
Ответ
Устанавливается django-filter и настраивается filter_backends и filterset_fields в viewset:
from django_filters.rest_framework import DjangoFilterBackend
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['published']
Вопрос
Как добавить пагинацию в DRF?
Ответ
Настраивается класс пагинации в settings.py или в самом viewset:
from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
page_size = 10
class ArticleViewSet(viewsets.ModelViewSet):
pagination_class = StandardResultsSetPagination
Вопрос
Как вернуть ошибку валидации в Flask API?
Ответ
Возвращается JSON с кодом 400:
return jsonify({'error': 'Invalid input'}), 400
Вопрос
Как вернуть ошибку валидации в DRF?
Ответ
Сериализатор автоматически возвращает ошибки с кодом 400, если вызван is_valid(raise_exception=True).
Вопрос
Как протестировать API вручную?
Ответ
Используются инструменты вроде curl, httpie или Postman для отправки HTTP-запросов и анализа ответов.
Вопрос
Как документировать API в DRF?
Ответ
Используется пакет drf-spectacular или drf-yasg для генерации OpenAPI/Swagger-документации.
Вопрос
Как документировать API в Flask?
Ответ
Используются библиотеки вроде flasgger (для Swagger) или apispec с marshmallow.
Вопрос
Что такое CORS и зачем он нужен в API?
Ответ
CORS (Cross-Origin Resource Sharing) — это механизм, позволяющий браузеру делать запросы к API с другого домена. Без настройки CORS такие запросы блокируются.
Вопрос
Как включить CORS в Django?
Ответ
Устанавливается пакет django-cors-headers и добавляется в middleware и настройки.
Вопрос
Как включить CORS в Flask?
Ответ
Используется расширение Flask-CORS:
from flask_cors import CORS
CORS(app)
Вопрос
Как обрабатывать исключения в DRF?
Ответ
Определяется кастомный обработчик через EXCEPTION_HANDLER в настройках REST framework или переопределяется метод handle_exception в view.
Тестирование
Вопрос
Какие встроенные средства тестирования предоставляет Django?
Ответ
Django предоставляет фреймворк на основе unittest, расширенный классом TestCase с поддержкой базы данных, клиентских запросов и утилит для проверки шаблонов и редиректов.
Вопрос
Как создать тестовый класс в Django?
Ответ
Наследуется от django.test.TestCase:
from django.test import TestCase
from .models import Article
class ArticleModelTest(TestCase):
def test_article_title(self):
article = Article.objects.create(title="Test")
self.assertEqual(article.title, "Test")
Вопрос
Как отправить HTTP-запрос в тесте Django?
Ответ
Используется клиент self.client:
response = self.client.get('/article/1/')
self.assertEqual(response.status_code, 200)
Вопрос
Как протестировать POST-запрос в Django?
Ответ
Передаются данные в метод post:
response = self.client.post('/submit/', {'name': 'Alice'})
self.assertRedirects(response, '/success/')
Вопрос
Как проверить, что view использует определённый шаблон?
Ответ
Используется утверждение assertTemplateUsed:
response = self.client.get('/')
self.assertTemplateUsed(response, 'index.html')
Вопрос
Как протестировать форму в Django?
Ответ
Создаётся экземпляр формы с данными и проверяется метод is_valid():
form = NameForm(data={'name': ''})
self.assertFalse(form.is_valid())
Вопрос
Как изолировать базу данных в тестах Django?
Ответ
Django автоматически создаёт временную тестовую базу, которая удаляется после завершения тестов. Каждый тестовый метод выполняется в транзакции, откатываемой после завершения.
Вопрос
Можно ли использовать существующую базу данных для тестов в Django?
Ответ
Да, если задать параметр TEST в настройке DATABASES с ключом 'NAME', но это не рекомендуется, так как нарушает изоляцию.
Вопрос
Какие библиотеки используются для тестирования во Flask?
Ответ
Часто применяются unittest, pytest, а также встроенный тестовый клиент Flask.
Вопрос
Как создать тестовый клиент во Flask?
Ответ
Используется атрибут test_client() приложения:
def test_home_page():
with app.test_client() as client:
response = client.get('/')
assert response.status_code == 200
Вопрос
Как передать данные в POST-запрос при тестировании Flask?
Ответ
Данные передаются через параметр data:
response = client.post('/submit', data={'name': 'Alice'})
Вопрос
Как проверить JSON-ответ в тесте Flask?
Ответ
Извлекается response.get_json():
data = response.get_json()
assert data['name'] == 'Alice'
Вопрос
Как имитировать сессию во Flask-тесте?
Ответ
Используется контекстный менеджер client.session_transaction():
with client.session_transaction() as sess:
sess['username'] = 'alice'
Вопрос
Как протестировать защищённый маршрут (с @login_required) во Flask?
Ответ
Устанавливается сессия с нужными данными или мокируется current_user с помощью unittest.mock.
Вопрос
Как запустить тесты в Django?
Ответ
Выполняется команда:
python manage.py test
Вопрос
Как запустить тесты во Flask?
Ответ
Если используется pytest:
pytest
Если используется unittest:
python -m unittest discover
Вопрос
Что такое фикстуры в тестировании?
Ответ
Фикстуры — это предопределённые данные, загружаемые в базу перед тестами. В Django они задаются через файлы fixtures в формате JSON или YAML.
Вопрос
Как загрузить фикстуру в тесте Django?
Ответ
Указывается атрибут fixtures в классе теста:
class MyTest(TestCase):
fixtures = ['users.json']
Вопрос
Как протестировать API с аутентификацией в DRF?
Ответ
Используется force_authenticate в тестовом клиенте DRF:
from rest_framework.test import force_authenticate
factory = APIRequestFactory()
request = factory.get('/api/articles/')
force_authenticate(request, user=user)
Вопрос
Как протестировать токенную аутентификацию в DRF?
Ответ
Передаётся заголовок HTTP_AUTHORIZATION:
client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
response = client.get('/api/articles/')
(Раздел «Тестирование» завершён. Переходим к Безопасности.)
Безопасность
Вопрос
Как Django защищает от CSRF-атак?
Ответ
Django включает middleware CsrfViewMiddleware, которое проверяет наличие и корректность CSRF-токена в POST-запросах. Токен вставляется в формы через {% csrf_token %}.
Вопрос
Как отключить CSRF-проверку для view в Django?
Ответ
Применяется декоратор @csrf_exempt:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def webhook_view(request):
return HttpResponse("OK")
Вопрос
Как Flask защищает от CSRF?
Ответ
Flask не имеет встроенной защиты. Используется расширение Flask-WTF, которое добавляет CSRF-токен через {{ form.hidden_tag() }} и проверяет его автоматически.
Вопрос
Что такое XSS и как Django предотвращает его?
Ответ
XSS (межсайтовый скриптинг) — это внедрение вредоносного JavaScript в страницу. Django автоматически экранирует переменные в шаблонах, предотвращая выполнение кода.
Вопрос
Как отключить экранирование в шаблоне Django?
Ответ
Используется фильтр safe:
{{ content|safe }}
Только для доверенного содержимого.
Вопрос
Как Flask предотвращает XSS?
Ответ
Jinja2 автоматически экранирует все переменные в шаблонах. Экранирование можно отключить с помощью фильтра |safe.
Вопрос
Что такое SQL-инъекция и как её предотвратить?
Ответ
SQL-инъекция — это атака, при которой злоумышленник внедряет произвольный SQL-код через входные данные. ORM Django и SQLAlchemy предотвращают инъекции, используя параметризованные запросы.
Вопрос
Безопасно ли использовать сырой SQL в Django?
Ответ
Только если параметры передаются отдельно, а не конкатенируются в строку:
Article.objects.raw('SELECT * FROM app_article WHERE id = %s', [user_id])
Вопрос
Что такое безопасные HTTP-заголовки?
Ответ
Это заголовки, повышающие безопасность: X-Content-Type-Options, X-Frame-Options, Content-Security-Policy. Django предоставляет middleware для их установки.
Вопрос
Как включить безопасные заголовки в Django?
Ответ
Добавляются middleware:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# ...
]
И настраиваются параметры вроде SECURE_HSTS_SECONDS.
Вопрос
Как защитить секретный ключ в Flask?
Ответ
SECRET_KEY хранится вне кода — в переменных окружения или файлах конфигурации, не попадающих в систему контроля версий.
Вопрос
Как защитить секретный ключ в Django?
Ответ
SECRET_KEY извлекается из переменной окружения:
import os
SECRET_KEY = os.environ.get('SECRET_KEY')
Вопрос
Что такое clickjacking и как Django защищает от него?
Ответ
Clickjacking — это атака, при которой вредоносный сайт встраивает ваш сайт во фрейм. Django блокирует встраивание через middleware XFrameOptionsMiddleware.
Вопрос
Как разрешить встраивание только для определённых доменов?
Ответ
Используется декоратор @xframe_options_exempt или настраивается заголовок Content-Security-Policy: frame-ancestors.
Вопрос
Что такое rate limiting и зачем он нужен?
Ответ
Rate limiting ограничивает количество запросов от клиента за единицу времени, предотвращая перегрузку сервера и brute-force атаки.
Вопрос
Как реализовать rate limiting в Django?
Ответ
Используется пакет django-ratelimit или кастомное middleware с кэшем.
Вопрос
Как реализовать rate limiting во Flask?
Ответ
Используется расширение Flask-Limiter:
from flask_limiter import Limiter
limiter = Limiter(app, key_func=get_remote_address)
@app.route("/api")
@limiter.limit("5 per minute")
def api():
return "OK"
Вопрос
Что такое безопасное хранение файлов?
Ответ
Загружаемые файлы должны сохраняться вне веб-доступной директории или с проверкой типа, имени и содержимого, чтобы предотвратить выполнение вредоносного кода.
Вопрос
Как обезопасить загрузку файлов в Django?
Ответ
Используется FileField с валидацией расширений, проверкой MIME-типа и сохранением в недоступную напрямую директорию.
Вопрос
Как обезопасить загрузку файлов во Flask?
Ответ
Проверяется расширение файла, используется secure_filename() из Werkzeug, файлы сохраняются вне static.
Производительность и кэширование
Вопрос
Что такое кэширование в веб-приложениях?
Ответ
Кэширование — это временное хранение результатов операций (например, рендеринга страницы или запроса к базе данных) для ускорения последующих обращений.
Вопрос
Какие уровни кэширования поддерживает Django?
Ответ
Django поддерживает кэширование на уровне сайта, отдельных view, шаблонных фрагментов и низкоуровневого API. Источниками кэша могут быть память, файлы, база данных или Redis.
Вопрос
Как настроить кэш в Django?
Ответ
В settings.py задаётся конфигурация через параметр CACHES:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
Вопрос
Как закэшировать всю страницу в Django?
Ответ
Применяется декоратор @cache_page:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
return render(request, 'page.html')
Вопрос
Как закэшировать фрагмент шаблона в Django?
Ответ
Используется тег {% cache %}:
{% load cache %}
{% cache 500 sidebar %}
<!-- дорогой контент -->
{% endcache %}
Вопрос
Как использовать низкоуровневое кэширование в Django?
Ответ
Через объект cache:
from django.core.cache import cache
cache.set('my_key', 'value', timeout=300)
value = cache.get('my_key')
Вопрос
Поддерживает ли Flask встроенное кэширование?
Ответ
Flask не имеет встроенного кэширования, но предоставляет расширение Flask-Caching.
Вопрос
Как настроить кэширование во Flask?
Ответ
Инициализируется Cache с указанием бэкенда:
from flask_caching import Cache
cache = Cache(app, config={'CACHE_TYPE': 'RedisCache'})
Вопрос
Как закэшировать результат функции во Flask?
Ответ
Применяется декоратор @cache.cached():
@app.route('/expensive')
@cache.cached(timeout=60)
def expensive():
return str(time.time())
Вопрос
Как кэшировать с учётом аргументов URL во Flask?
Ответ
Используется @cache.memoize(), который учитывает аргументы функции:
@cache.memoize(timeout=60)
def get_user_data(user_id):
return fetch_from_db(user_id)
Вопрос
Что такое N+1 проблема?
Ответ
N+1 проблема возникает, когда для получения связанных данных выполняется один запрос на основную таблицу и N дополнительных запросов на каждую запись. Это снижает производительность.
Вопрос
Как решить N+1 проблему в Django?
Ответ
Используются методы select_related() для ForeignKey и prefetch_related() для ManyToManyField.
Вопрос
Как решить N+1 проблему в SQLAlchemy?
Ответ
Используется опция joinedload или subqueryload при построении запроса:
from sqlalchemy.orm import joinedload
users = session.query(User).options(joinedload(User.articles)).all()
Вопрос
Что такое lazy loading?
Ответ
Lazy loading — это стратегия загрузки связанных данных только при первом обращении к ним. Может приводить к N+1 проблеме.
Вопрос
Что такое eager loading?
Ответ
Eager loading — это предварительная загрузка связанных данных одним или несколькими запросами, что уменьшает общее количество обращений к базе.
Вопрос
Как профилировать производительность Django-приложения?
Ответ
Используются инструменты: django-debug-toolbar для разработки, логирование SQL-запросов через LOGGING, или APM-системы (например, Sentry, New Relic).
Вопрос
Как профилировать производительность Flask-приложения?
Ответ
Применяются профайлеры (cProfile), middleware для логирования запросов, или инструменты вроде flask-profiler и APM-агенты.
Вопрос
Что такое статические файлы и как их оптимизировать?
Ответ
Статические файлы — это CSS, JS, изображения. Их оптимизация включает минификацию, объединение, использование CDN и установку правильных заголовков кэширования.
Вопрос
Как обслуживать статические файлы в продакшене Django?
Ответ
Django не обслуживает статику напрямую в продакшене. Используется веб-сервер (Nginx) или облачное хранилище (S3). Команда collectstatic собирает все файлы в одну директорию.
Вопрос
Как обслуживать статические файлы в продакшене Flask?
Ответ
Flask не предназначен для обслуживания статики в продакшене. Используется внешний сервер (Nginx) или CDN.
(Раздел «Производительность и кэширование» завершён. Переходим к Развертыванию.)
Развертывание
Вопрос
Как развернуть Django-приложение в продакшене?
Ответ
Используется WSGI-сервер (Gunicorn, uWSGI), веб-сервер (Nginx) как обратный прокси, база данных (PostgreSQL), и настройки безопасности (DEBUG=False, ALLOWED_HOSTS).
Вопрос
Как развернуть Flask-приложение в продакшене?
Ответ
Используется WSGI-сервер (Gunicorn, uWSGI), веб-сервер (Nginx), переменные окружения для конфигурации и отключение режима отладки.
Вопрос
Зачем нужен Gunicorn?
Ответ
Gunicorn — это WSGI-HTTP-сервер, предназначенный для обслуживания Python-приложений в продакшене. Он обеспечивает многопроцессность, отказоустойчивость и совместимость с веб-серверами.
Вопрос
Как запустить Django через Gunicorn?
Ответ
Выполняется команда:
gunicorn myproject.wsgi:application
Вопрос
Как запустить Flask через Gunicorn?
Ответ
Указывается модуль и объект приложения:
gunicorn app:app
Вопрос
Зачем нужен Nginx перед Gunicorn?
Ответ
Nginx обрабатывает статические файлы, балансирует нагрузку, защищает от DDoS, управляет SSL и делегирует динамические запросы Gunicorn.
Вопрос
Как настроить SSL для Django/Flask?
Ответ
SSL настраивается на уровне веб-сервера (Nginx или Apache) с использованием сертификатов Let's Encrypt или коммерческих CA.
Вопрос
Как управлять зависимостями при развертывании?
Ответ
Зависимости фиксируются в requirements.txt с помощью pip freeze > requirements.txt и устанавливаются на сервере через pip install -r requirements.txt.
Вопрос
Что такое виртуальное окружение и зачем оно нужно?
Ответ
Виртуальное окружение изолирует зависимости проекта от системных пакетов Python. Создаётся командой python -m venv venv.
Вопрос
Как автоматизировать развёртывание Django/Flask?
Ответ
Используются CI/CD-системы (GitHub Actions, GitLab CI), Docker-образы, или инструменты вроде Ansible и Fabric.
Вопрос
Что такое Docker и как он помогает в развёртывании?
Ответ
Docker упаковывает приложение и его зависимости в контейнер, обеспечивая воспроизводимость и переносимость между средами.
Вопрос
Как создать Dockerfile для Django?
Ответ
Пример:
FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "myproject.wsgi:application"]
Вопрос
Как создать Dockerfile для Flask?
Ответ
Пример:
FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "app:app"]
Вопрос
Что такое .env файл и как его использовать?
Ответ
.env — это файл с переменными окружения. В Django и Flask значения из него загружаются с помощью библиотеки python-dotenv.
Вопрос
Как защитить чувствительные данные при развёртывании?
Ответ
Секреты (пароли, ключи) хранятся в переменных окружения или менеджерах секретов (HashiCorp Vault, AWS Secrets Manager), а не в коде.
Архитектурные паттерны и лучшие практики
Вопрос
Какой архитектурный паттерн использует Django?
Ответ
Django следует модифицированному паттерну MVC, который в документации называется MTV (Model-Template-View): Model отвечает за данные, Template — за представление, View — за логику обработки запроса.
Вопрос
Какой архитектурный паттерн использует Flask?
Ответ
Flask не навязывает конкретную архитектуру. Разработчик может выбрать любой паттерн: MVC, Clean Architecture, Hexagonal Architecture или простую структуру с view-функциями и сервисами.
Вопрос
Что такое разделение ответственности и как оно применяется в Django?
Ответ
Разделение ответственности означает, что модели управляют данными, view — логикой запросов, а шаблоны — отображением. Это упрощает поддержку и тестирование.
Вопрос
Как организовать код во Flask для масштабируемости?
Ответ
Используется паттерн Application Factory и Blueprints. Каждый Blueprint представляет отдельный модуль (например, auth, api), что позволяет разделять маршруты и избегать циклических импортов.
Вопрос
Что такое Application Factory во Flask?
Ответ
Application Factory — это функция, создающая экземпляр приложения. Она позволяет настраивать приложение динамически (например, для тестов или разных окружений):
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
return app
Вопрос
Что такое Blueprint во Flask?
Ответ
Blueprint — это способ группировать связанные маршруты, обработчики ошибок и другие компоненты. Он регистрируется в основном приложении:
from flask import Blueprint
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login')
def login():
return "Login"
Вопрос
Как избежать монолитного файла views.py в Django?
Ответ
Разбить views.py на несколько модулей: views/ как пакет с файлами user_views.py, article_views.py и т.д., или использовать классовые view в отдельных файлах.
Вопрос
Как организовать настройки для разных окружений в Django?
Ответ
Создаётся каталог settings/ с файлами base.py, development.py, production.py. Общие настройки выносятся в base.py, специфичные — переопределяются в дочерних.
Вопрос
Как организовать настройки для разных окружений во Flask?
Ответ
Определяются классы конфигурации:
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY')
class DevelopmentConfig(Config):
DEBUG = True
class ProductionConfig(Config):
DEBUG = False
Вопрос
Что такое принцип DRY и как он соблюдается в Django?
Ответ
DRY (Don’t Repeat Yourself) — это принцип минимизации дублирования кода. В Django он реализуется через наследование моделей, общие базовые классы view, кастомные менеджеры и миксины.
Вопрос
Что такое миксин в Django?
Ответ
Миксин — это класс, предоставляющий дополнительную функциональность для других классов через множественное наследование. Например, LoginRequiredMixin добавляет проверку авторизации.
Вопрос
Как обеспечить читаемость URL в Django?
Ответ
Используются понятные имена маршрутов (name=), семантические пути (/articles/2026/04/01/title/) и reverse-разрешение через reverse() или {% url %}.
Вопрос
Как обрабатывать ошибки централизованно в Flask?
Ответ
Регистрируются обработчики ошибок через @app.errorhandler:
@app.errorhandler(500)
def internal_error(e):
return jsonify({'error': 'Internal error'}), 500
Вопрос
Как обрабатывать ошибки централизованно в Django?
Ответ
Определяются функции вроде handler404, handler500 в основном urls.py или используется middleware для перехвата исключений.
Вопрос
Что такое идемпотентность HTTP-методов?
Ответ
Идемпотентная операция даёт одинаковый результат при повторном выполнении. GET, PUT, DELETE идемпотентны; POST — нет.
Вопрос
Как соблюдать RESTful-принципы в API?
Ответ
Используются существительные в путях (/articles), HTTP-методы для действий (GET — чтение, POST — создание, PUT/PATCH — обновление, DELETE — удаление), и статус-коды для результата.
Вопрос
Как избежать логики в шаблонах?
Ответ
Вся бизнес-логика выносится в view или сервисные функции. Шаблоны содержат только отображение и простые условия/циклы.
Вопрос
Что такое сервисный слой?
Ответ
Сервисный слой — это набор функций или классов, инкапсулирующих бизнес-логику. Он вызывается из view и не зависит от HTTP-контекста, что упрощает тестирование.
Вопрос
Как внедрить сервисный слой в Django?
Ответ
Создаётся модуль services.py в приложении:
# articles/services.py
def publish_article(article_id):
article = Article.objects.get(id=article_id)
article.is_published = True
article.save()
Вопрос
Как внедрить сервисный слой во Flask?
Ответ
Создаётся пакет services с модулями:
# services/user_service.py
def create_user(username, email):
user = User(username=username, email=email)
db.session.add(user)
db.session.commit()
return user
Вопрос
Зачем использовать типизацию в Python-проектах?
Ответ
Типизация повышает читаемость, позволяет использовать статические анализаторы (mypy) и улучшает поддержку в IDE.
Вопрос
Поддерживает ли Django типизацию?
Ответ
Да. Современные версии Django включают stub-файлы и совместимы с mypy. Для улучшения типизации используются пакеты вроде django-stubs.
Вопрос
Поддерживает ли Flask типизацию?
Ответ
Да. Flask совместим с mypy, особенно при использовании явных аннотаций и расширений с типовыми заглушками.
Вопрос
Как документировать код в проекте на Django/Flask?
Ответ
Используются docstring в Google- или NumPy-стиле, комментарии для сложной логики, и внешняя документация для API и архитектуры.
Вопрос
Какие принципы SOLID применимы к веб-приложениям?
Ответ
Принцип единственной ответственности (S) — каждый компонент делает одно дело. Принцип инверсии зависимостей (D) — зависимости передаются через интерфейсы или параметры, а не создаются внутри.
Вопрос
Как избежать жёсткой привязки к базе данных?
Ответ
Использовать абстракции (репозитории или сервисы), не вызывать ORM напрямую из view, и проектировать логику так, чтобы её можно было протестировать без базы.
Вопрос
Что такое репозиторий в контексте веб-приложений?
Ответ
Репозиторий — это класс, инкапсулирующий доступ к данным. Он предоставляет методы вроде get_by_id(), save(), скрывая детали ORM от остального кода.
Вопрос
Как применить паттерн Repository в Django?
Ответ
Создаётся класс:
class ArticleRepository:
def get_by_id(self, id):
return Article.objects.get(id=id)
def save(self, article):
article.save()
Вопрос
Как применить паттерн Repository во Flask?
Ответ
Аналогично:
class UserRepository:
def get_by_id(self, user_id):
return User.query.get(user_id)
def save(self, user):
db.session.add(user)
db.session.commit()
Вопрос
Что такое health check и зачем он нужен?
Ответ
Health check — это эндпоинт (/health), возвращающий статус готовности приложения. Используется оркестраторами (Kubernetes) и мониторингом для определения работоспособности.
Вопрос
Как реализовать health check в Django?
Ответ
Создаётся простой view:
def health(request):
return JsonResponse({'status': 'ok'})
Вопрос
Как реализовать health check во Flask?
Ответ
Простой маршрут:
@app.route('/health')
def health():
return jsonify({'status': 'ok'})
Вопрос
Как логировать ошибки в продакшене?
Ответ
Настраивается модуль logging в Django или Flask с отправкой записей в файл, Sentry или системный журнал. Уровень ERROR или CRITICAL перехватывает исключения.
Вопрос
Почему важно избегать print() в продакшен-коде?
Ответ
print() не интегрирован с системой логирования, не имеет уровней серьёзности и может нарушать формат вывода. Вместо него используется logger.
Вопрос
Как обеспечить обратную совместимость API?
Ответ
Не удалять поля из ответов, не менять формат существующих эндпоинтов, использовать версионирование (/api/v1/...) и депрекейтить старые методы постепенно.
Вопрос
Что такое graceful shutdown?
Ответ
Graceful shutdown — это корректное завершение работы приложения: завершение активных запросов, закрытие соединений с базой и освобождение ресурсов перед остановкой процесса.