Python | Вопросы собесов
13.4K subscribers
38 photos
5 videos
1 file
1.32K links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Что такое REST?

REST (Representational State Transfer) — это архитектурный стиль, используемый при разработке API.
Он основывается на принципах HTTP и работе с ресурсами, которые доступны по URL.
Каждый запрос клиента должен быть самодостаточным (stateless), а взаимодействие строится с использованием стандартных HTTP-методов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🤔 Как избежать конфликтов при импорте файлов?

Когда в проекте много файлов, могут возникать конфликты импортов. Python ищет модули в определённом порядке, и если несколько файлов имеют одинаковые имена или неправильные пути, может возникнуть ошибка.

🚩Способы избежать конфликтов при импорте

🟠Используйте явные пути импорта
Вместо
import mymodule  # Может вызвать конфликт, если есть несколько файлов с таким именем


Лучше указывать полный путь в пакетах
from myproject.utils.mymodule import my_function


🟠Избегайте конфликтов имён файлов
Если у вас есть файл math.py, импорт import math будет загружать ваш файл, а не стандартный модуль math из Python.
- Не называйте файлы именами стандартных модулей: math.py, sys.py, json.py.
- Проверьте, какой именно модуль загружается:

  import math
print(math.__file__) # Путь к загруженному модулю


🟠Добавьте `__init__.py` в пакеты
Если у вас есть структура
/myproject
/utils
mymodule.py


Решение
Добавьте пустой __init__.py в utils/:
/myproject
/utils
__init__.py # Делаем utils пакетом
mymodule.py


Теперь импорт будет работать
from utils import mymodule


🟠Используйте `sys.path.append()` для указания путей
Иногда Python не находит модуль, если он находится вне стандартных путей. Решение
Добавьте путь вручную:
import sys
sys.path.append("/path/to/directory")

import mymodule # Теперь импорт будет работать


🟠Используйте `absolute` и `relative` импорт в пакетах
Абсолютный импорт (рекомендуется)
from myproject.utils.mymodule import my_function


Относительный импорт (используется внутри пакетов):
from .mymodule import my_function


🟠Проверяйте `sys.modules` и `sys.path`
Если импорт не работает, проверьте, какие модули загружены и где Python ищет файлы
import sys
print(sys.modules.keys()) # Список загруженных модулей
print(sys.path) # Пути, где Python ищет модули


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Какая версия HTTP сейчас используется?

Актуальные версии:
- HTTP/1.1 — долгое время был основным стандартом.
- HTTP/2 — быстрее, поддерживает параллельную загрузку, используется в большинстве современных сайтов.
- HTTP/3 — новейшая версия, работает поверх QUIC (а не TCP), быстрее и безопаснее.
HTTP/2 и HTTP/3 — будущее веба, и большинство крупных сервисов уже их применяют.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
🤔 Какая сложность у пузырьковой сортировки?

Пузырьковая сортировка (Bubble Sort) — это один из самых простых, но неэффективных алгоритмов сортировки.

🚩Как работает пузырьковая сортировка?

1. Проходим по массиву несколько раз.
2. На каждой итерации сравниваем соседние элементы и меняем их местами, если они идут не в том порядке.
3. После первого прохода наибольший элемент оказывается в конце массива.
4. Повторяем процесс, пока массив не отсортируется.

🚩Рассчёт сложности (`O(n²)`)

Количество сравнений в худшем случае:
- На первой итерации: n-1 сравнений
- На второй: n-2 сравнений
- На третьей: n-3 сравнений
- …
- Всего: (n-1) + (n-2) + ... + 1 = O(n²)
Количество обменов (swap) в худшем случае:
- Если массив полностью перевёрнут, на каждой итерации будет максимальное количество перестановок → O(n²).

🚩Оптимизированная пузырьковая сортировка (`O(n)`)
Если на проходе по массиву не было перестановок, значит массив уже отсортирован.
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False # Флаг, отслеживающий перестановки
for j in range(n - i - 1):
if arr[j] > arr[j + 1]: # Если элементы в неправильном порядке, меняем местами
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
if not swapped:
break # Если перестановок не было, завершаем сортировку

arr = [1, 2, 3, 4, 5] # Уже отсортированный массив
bubble_sort(arr)
print(arr) # [1, 2, 3, 4, 5]


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Что возвращают операторы and, or, not?

Они возвращают не обязательно логическое значение, а сам объект, участвующий в выражении. Например, оператор or вернёт первый "правдивый" объект, а and — последний, если все "правдивые". Это поведение используется, например, для задания значений по умолчанию.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7👍4
🤔 Что такое паттерн Мост (Bridge)?

Паттерн "Мост" (Bridge) является структурным паттерном проектирования, который предназначен для разделения абстракции и реализации так, чтобы они могли изменяться независимо друг от друга. Этот паттерн полезен, когда класс должен работать с различными платформами или когда нужно избежать жесткой связки между абстракцией и ее реализацией.

🚩 Зачем нужен

🟠Разделение абстракции и реализации:
Он позволяет отделить абстракцию от ее реализации, что упрощает поддержку и расширение системы.
🟠Уменьшение количества подклассов:
Без применения этого паттерна, если у нас есть несколько вариантов абстракции и несколько вариантов реализации, то нам пришлось бы создавать классы для всех возможных комбинаций, что приводит к взрывному росту количества классов.
🟠Гибкость:
Это позволяет изменять и абстракцию, и реализацию независимо друг от друга.

🚩Как используется

🟠Абстракция (Abstraction):
Определяет интерфейс и хранит ссылку на объект Implementor.
🟠Расширенная абстракция (RefinedAbstraction):
Наследует Abstraction и расширяет интерфейс.
🟠Реализатор (Implementor):
Определяет интерфейс для всех реализаций.
🟠Конкретный реализатор (ConcreteImplementor):
Реализует интерфейс Implementor.

Допустим, у нас есть программа для управления различными типами устройств (например, телевизор и радио), которые можно включать и выключать. Мы хотим, чтобы способ управления устройствами мог изменяться независимо от типов устройств.
# Implementor
class Device:
def is_enabled(self):
pass

def enable(self):
pass

def disable(self):
pass

# ConcreteImplementor
class TV(Device):
def __init__(self):
self._on = False

def is_enabled(self):
return self._on

def enable(self):
self._on = True

def disable(self):
self._on = False

class Radio(Device):
def __init__(self):
self._on = False

def is_enabled(self):
return self._on

def enable(self):
self._on = True

def disable(self):
self._on = False

# Abstraction
class RemoteControl:
def __init__(self, device):
self._device = device

def toggle_power(self):
if self._device.is_enabled():
self._device.disable()
else:
self._device.enable()

# RefinedAbstraction
class AdvancedRemoteControl(RemoteControl):
def mute(self):
print("Device is muted.")

# Клиентский код
tv = TV()
remote = RemoteControl(tv)
remote.toggle_power() # Включает TV

radio = Radio()
advanced_remote = AdvancedRemoteControl(radio)
advanced_remote.toggle_power() # Включает Radio
advanced_remote.mute() # Заглушает Radio


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
🤔 Как происходит наследование моделей в Django?

В Django есть три способа наследования моделей:
- Абстрактные модели — базовый класс с полями и методами, который не создает свою таблицу в базе. Используется с Meta: abstract = True.
- Мультабличное наследование — каждая модель (родитель и наследник) создаёт отдельную таблицу. Django связывает их через JOIN. Полезно, когда нужно сохранить общие поля, но требуется хранить их раздельно.
- Прокси-модели — создают новый класс на основе существующей модели, не добавляя новых полей. Используются для изменения поведения, сортировки, менеджеров и т.д., без создания новой таблицы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
🤔 Какие есть методы чтобы реализовать протокол итерирования данных?

Для реализации протокола итерирования данных в Python необходимо использовать два метода: __iter__() и __next__().

🚩Протокол итератора

🟠Метод `__iter__()`
Этот метод должен возвращать объект-итератор. В простом случае он возвращает сам объект, если объект реализует метод __next__(). Метод __iter__() необходим для того, чтобы объект можно было использовать в конструкциях, которые требуют итерируемого объекта, таких как циклы for.
🟠Метод __next__()
Этот метод возвращает следующий элемент в последовательности. Когда элементы заканчиваются, метод должен вызвать исключение StopIteration для остановки итерации.

class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start

def __iter__(self):
self.current = self.start # Перезапуск итератора при каждом вызове
return self

def __next__(self):
if self.current >= self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1

# Использование
for number in MyRange(1, 5):
print(number)


🚩Дополнительно: итераторы и генераторы

Для упрощения создания итераторов в Python можно использовать генераторы. Генераторы позволяют писать итераторы с использованием ключевого слова yield вместо определения методов __iter__() и __next__() вручную.
def my_range(start, end):
current = start
while current < end:
yield current
current += 1

# Использование
for number in my_range(1, 5):
print(number)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 D - Dependency Inversion Principle - принцип инверсии зависимостей

Модули высокого уровня не должны зависеть от модулей низкого уровня, оба должны зависеть от абстракций. Это упрощает тестирование и снижает связность.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4💊3👍2
🤔 Что такое SDLC?

Это методология управления процессом создания программного обеспечения, которая включает в себя последовательность этапов и действий, необходимых для разработки, тестирования, развертывания и поддержки программных продуктов. Цель SDLC — обеспечить структурированный и эффективный подход к разработке ПО, минимизируя риски и повышая качество конечного продукта.

🚩Основные этапы SDLC

🟠Планирование и анализ требований (Planning and Requirements Analysis)
На этом этапе определяются цели проекта, анализируются потребности и требования к системе. Включает сбор требований от заинтересованных сторон, анализ бизнес-процессов и создание документации с описанием требований.
Встречи с клиентами и пользователями для определения функций системы. Документирование функциональных и нефункциональных требований.

🟠Проектирование (Design)
На этапе проектирования разрабатывается архитектура системы и ее компоненты. Создаются технические спецификации, включая схемы базы данных, диаграммы классов и интерфейсов, а также детализируется план реализации.Разработка диаграмм UML.Создание прототипов пользовательского интерфейса.Проектирование архитектуры системы.

🟠Разработка (Implementation or Coding)
На этом этапе осуществляется непосредственная разработка программного обеспечения на основе спецификаций, созданных на предыдущем этапе. Кодирование выполняется в соответствии с выбранными языками программирования и инструментами разработки. Написание кода для модулей и компонентов системы. Интеграция различных компонентов системы. Регулярное использование систем контроля версий (например, Git).

🟠Тестирование (Testing)
Этап тестирования включает проверку и валидацию системы для обнаружения и исправления ошибок. Тестирование проводится в различных формах, включая юнит-тестирование, интеграционное тестирование, системное тестирование и приемочное тестирование. Автоматизированное тестирование с использованием фреймворков, таких как pytest или JUnit. Ручное тестирование функциональности и пользовательского интерфейса. Тестирование производительности и безопасности.

🟠Развертывание (Deployment)
На этом этапе программное обеспечение разворачивается в рабочей среде и становится доступным пользователям. Включает настройку серверов, развертывание баз данных и настройку инфраструктуры. Развертывание на облачных платформах, таких как AWS или Azure. Настройка и конфигурация серверов и сетей. Миграция данных и начальная загрузка данных.

🟠Поддержка и сопровождение (Maintenance)
Этап поддержки и сопровождения включает в себя обслуживание и улучшение системы после ее развертывания. Включает исправление ошибок, обновление функциональности и оптимизацию производительности. Обновление системы безопасности. Внесение изменений на основе отзывов пользователей. Обслуживание серверов и баз данных.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🤔 Что такое diamond problem?

1. Diamond problem — проблема неоднозначности при наследовании, возникающая, если класс наследует от двух классов, имеющих общего предка.
2. Например, вызов метода может быть неясным, если он присутствует в обоих родительских классах.
3. Решает это с помощью алгоритма MRO (Method Resolution Order), который определяет порядок вызовов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4
🤔 Что можете сказать о конструкции import package.item?

Конструкция import package.item используется для импорта конкретного подмодуля или элемента из пакета в Python.

🚩Пакеты и Подмодули

Пакет — это каталог, который содержит файл __init__.py и может содержать подкаталоги и модули. Подкаталоги в пакете также могут содержать файлыия import py, что делает их под-пакетами. Пример структуры пакета:
package/


вероятность
py
item.py
subpackage/


Конструкции
py
subitem.py


🚩Импорт Подмодуля

Конструкция import package.item позволяет импортировать подмодуль item из пакета package. Например:
import package.item

# Теперь вы можете использовать функции и классы из package.item
package.item.some_function()


🚩Почему это важно?

🟠Организация кода
Пакеты позволяют структурировать код в иерархическую систему, что делает его более организованным и модульным.

🟠Избежание конфликтов имен
Использование пакетов помогает избежать конфликтов имен, так как разные модули могут иметь одинаковые имена, но располагаться в разных пакетах.

🟠Управление зависимостями
Пакеты упрощают управление зависимостями между различными частями кода.

Структура каталога
math_operations/


init.
py
addition.py
subtraction.py


Код вort package.ite
def add(a, b):
return a + b


Код вport package.item
def subtract(a, b):
return a - b


Использование в скрипте
import math_operations.addition
import math_operations.subtraction

result_add = math_operations.addition.add(5, 3)
result_subtract = math_operations.subtraction.subtract(5, 3)

print("Addition:", result_add) # Выведет: Addition: 8
print("Subtraction:", result_subtract) # Выведет: Subtraction: 2


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое RESTful?

RESTful — это термин, обозначающий API, реализующее принципы REST.
Такой API:
- работает с ресурсами;
- использует понятные URL;
- использует HTTP-методы по назначению (например, GET для получения, POST для создания);
- возвращает стандартизированные ответы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔2💊2
🤔 Что такое объект первого класса?

Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:

🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).

🚩Почему это важно?

Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.

🚩Пример на Python

Присваивание функции переменной
def say_hello():
return "Hello!"

# Функция присваивается переменной
greet = say_hello
print(greet()) # Вывод: Hello!


Передача функции как аргумента
def apply_function(func, value):
return func(value)

def square(x):
return x * x

result = apply_function(square, 5)
print(result) # Вывод: 25


Возврат функции из функции
def multiplier(n):
def multiply(x):
return x * n
return multiply

double = multiplier(2)
print(double(10)) # Вывод: 20


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Как реализуется связь ManyToMany (M2M) на уровне базы данных?

Связь ManyToManyField в Django создает промежуточную таблицу, которая хранит связи между двумя таблицами. На уровне базы данных это:
- Таблица A (например, Course)
- Таблица B (например, Student)
- Дополнительная таблица (A_B) с двумя внешними ключами (course_id, student_id)


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Как управлять кешированием в HTTP?

Кэширование в HTTP позволяет уменьшить нагрузку на сервер и ускорить загрузку страниц за счёт сохранения копий ресурсов.
Управление кэшем происходит через HTTP-заголовки, которые указывают, как долго хранить данные и когда обновлять их.

🟠Управление кэшированием через `Cache-Control`
Cache-Control — основной заголовок для кэширования, который указывает, как долго хранить ресурс и когда обновлять его.
Cache-Control: no-cache            # Браузер всегда запрашивает ресурс заново
Cache-Control: no-store # Запрещает кэширование вообще
Cache-Control: public, max-age=3600 # Кэшировать 1 час (3600 секунд)
Cache-Control: private, max-age=600 # Кэш только для одного пользователя (например, личный кабинет)
Cache-Control: must-revalidate # Клиент должен проверять, истёк ли срок кэша перед загрузкой


🟠Управление кэшем с `ETag` (оптимизированное обновление)
ETag — это уникальный идентификатор версии файла.
Сервер отправляет ресурс с ETag:
ETag: "abc123"

При следующем запросе браузер отправляет If-None-Match:
If-None-Match: "abc123"


Если ресурс не изменился, сервер отвечает 304 Not Modified (клиент использует кэш).
Если ресурс изменился — сервер отправляет новую версию.
HTTP/1.1 304 Not Modified


🟠Кэширование через `Last-Modified`
Работает аналогично ETag, но вместо идентификатора используется дата последнего изменения.
Сервер отправляет заголовок
Last-Modified: Wed, 21 Feb 2024 10:00:00 GMT


Браузер запрашивает ресурс с If-Modified-Since
If-Modified-Since: Wed, 21 Feb 2024 10:00:00 GMT


🟠Полное отключение кэша
Если нужно всегда загружать свежие данные, используем:
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache # Устарел, но нужен для старых браузеров
Expires: 0


🟠Управление кэшем через `Vary`
Если ресурс зависит от заголовков (User-Agent, Accept-Encoding), используем Vary.
Vary: User-Agent


🟠Принудительное обновление кэша (Cache Busting)
Если сервер отправил старый кэш, можно обновить ресурс с новым URL.
Способы
Добавить версию в URL
/style.css?v=2


Использовать хеш в имени файла:
/style.abc123.css


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что нужно отправить браузеру, чтобы перенаправить на другую страницу?

Чтобы перенаправить браузер на другую страницу, сервер должен отправить HTTP-ответ со статус-кодом 3xx, чаще всего 301 Moved Permanently или 302 Found, и обязательно указать заголовок Location с новым URL.
Браузер получает этот ответ и автоматически переходит по адресу, указанному в Location.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
🤔 Как сгенерировать и применить миграцию?

В Django миграции используются для изменения структуры базы данных (создание, изменение и удаление таблиц и полей).

🚩Генерация миграции (`makemigrations`)

🟠Создаём или изменяем модель (`models.py`)
Пример модели пользователя:
from django.db import models

class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()


🟠Генерируем миграцию
Запускаем команду:
python manage.py makemigrations


Django создаст файл миграции в migrations/
migrations/
0001_initial.py # Файл с SQL-изменениями


Проверяем SQL-запрос, который будет выполнен
python manage.py sqlmigrate myapp 0001


🚩Применение миграции (`migrate`)

После генерации нужно применить миграции к базе данных:
python manage.py migrate


🚩Что делать, если модель изменилась?

Добавим поле в models.py
class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField(default="example@example.com") # Добавили поле


Сгенерируем новую миграцию
python manage.py makemigrations


Применяем изменения к БД
python manage.py migrate


🚩Откат миграций (`migrate <номер>`)

Если нужно откатить последнее изменение:
python manage.py migrate myapp 0001  # Откат до первой миграции


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Если не поставить двоеточие в конце строки для цикла do-while, он всё равно сработает?

В Python нет конструкции do-while, и любой цикл (for, while) требует двоеточия в конце строки. Без него будет синтаксическая ошибка.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊13👍5
🤔 Назовите основные мидлвари, зачем они нужны

Middleware (промежуточное ПО) — это специальные классы, которые обрабатывают запросы и ответы, проходящие через Django. Они позволяют изменять данные, проверять доступ, логировать действия и многое другое.

🚩Основные мидлвари Django

🟠SecurityMiddleware
Добавляет важные HTTP-заголовки для защиты сайта:
- Strict-Transport-Security (HTTPS)
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY

🟠CommonMiddleware
Отвечает за:
Перенаправление с APPEND_SLASH=True (если /about → перенаправит на /about/).
Удаление www. (www.example.comexample.com).
Обработка кодировки и контента.

🟠SessionMiddleware
Позволяет Django хранить данные пользователя между запросами (например, авторизацию).
request.session["user_id"] = 42  # Сохраняем ID пользователя в сессии


🟠AuthenticationMiddleware
Позволяет работать с request.user, автоматически определяя пользователя.
if request.user.is_authenticated:
print(f"Пользователь: {request.user.username}")


🟠CSRF Middleware (CsrfViewMiddleware)
Защищает от атак межсайтовой подделки запросов (CSRF).
При обработке форм Django требует специальный CSRF-токен:
<form method="POST">
{% csrf_token %}
<input type="text" name="name">
</form>


🟠XFrameOptionsMiddleware
Запрещает встраивать сайт в <iframe>, предотвращая атаку Clickjacking.
X-Frame-Options: DENY


🟠MessageMiddleware
Позволяет передавать временные сообщения (django.contrib.messages).
from django.contrib import messages

messages.success(request, "Вы успешно вошли!")
messages.error(request, "Ошибка авторизации!")


🚩Как добавить или отключить мидлвари?

Мидлвари хранятся в settings.py:
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
]


🚩Как написать свой мидлвар?

Допустим, хотим логировать все запросы.
Создаём middleware.py
import datetime

class LogMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
print(f"[{datetime.datetime.now()}] Запрос: {request.path}")
response = self.get_response(request)
return response


Добавляем в settings.py
MIDDLEWARE.append("myapp.middleware.LogMiddleware")


Теперь в консоли будем видеть все запросы!
[2024-02-28 12:00:00] Запрос: /
[2024-02-28 12:01:00] Запрос: /login/


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6