Перейти к основному содержимому

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 — это корректное завершение работы приложения: завершение активных запросов, закрытие соединений с базой и освобождение ресурсов перед остановкой процесса.