- APIView — это классический контроллер, где каждый метод (get, post, put, delete) нужно определять вручную.
- ViewSet — это более абстрактный подход, где основные CRUD-операции реализуются автоматически, используя роутеры.
ViewSet удобнее для REST API, так как требует меньше кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥7❤2
Хеш-таблица (HashMap) — это структура данных, которая позволяет быстро хранить и искать пары ключ → значение. В Python её аналогом является
dict
.Ключ проходит через хеш-функцию → превращается в число (индекс).
Значение сохраняется в массиве по этому индексу.
При поиске: ключ снова хешируется, и мы мгновенно находим нужное значение.
Создание хеш-таблицы (
dict
)hash_map = {} # Пустой словарь
hash_map["apple"] = 10 # Добавляем элемент
hash_map["banana"] = 20
print(hash_map["apple"]) # 10
Ключи сначала хешируются с помощью встроенной функции
hash()
. print(hash("apple")) # Например: 2837462816
print(hash("banana")) # Другое число
Иногда разные ключи могут давать одинаковый хеш. Это называется коллизией. Python использует метод цепочек (Chaining): Если у двух ключей один хеш, они хранятся в виде списка в одной ячейке.
hash_map = { "key1": 100, "key2": 200 }
print(hash("key1") % 10) # Допустим, 4
print(hash("key2") % 10) # Тоже 4 (коллизия!)
# Python хранит их в одной ячейке как список [(key1, 100), (key2, 200)]
При заполнении хеш-таблицы, если она становится слишком загруженной, Python автоматически увеличивает её размер, чтобы избежать замедления.
d = {} # Создаём пустой dict
for i in range(1000):
d[i] = i
print(len(d)) # 1000, Python сам расширил таблицу
Удаление также выполняется за O(1)
del hash_map["apple"] # Мгновенно удаляем
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2
Работа с сетью включает в себя обмен данными между клиентом и сервером через HTTP, WebSocket или другие протоколы. В Django это реализуется через запросы к API, обработку ответов, аутентификацию и защиту данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
Функция
sleep()
из модуля time
приостанавливает выполнение программы на заданное количество секунд. Функция
sleep()
принимает один аргумент** — число секунд (может быть дробным). import time
print("Программа началась...")
time.sleep(3) # Ожидание 3 секунды
print("3 секунды прошло!")
Ожидание в цикле (имитация загрузки)
for i in range(5, 0, -1):
print(i)
time.sleep(1) # Задержка 1 секунда между выводами
print("Старт!")
Запросы к серверу с паузами (чтобы не забанили)
import time
import requests
for i in range(3):
response = requests.get("https://example.com")
print(f"Запрос {i+1}: статус {response.status_code}")
time.sleep(2) # Ждём 2 секунды перед следующим запросом
Искусственная задержка перед повторной попыткой
for attempt in range(3):
print(f"Попытка {attempt + 1}...")
time.sleep(2) # Ожидание 2 секунды перед новой попыткой
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤯1💊1
Можно определить модель пользователя несколькими способами:
1. Использовать стандартную модель User (django.contrib.auth.models.User)
2. Расширить AbstractUser — добавляет кастомные поля, сохраняя стандартную функциональность
3. Наследоваться от AbstractBaseUser — полный контроль над моделью пользователя
4. Создать кастомного пользователя с OneToOneField к стандартному User
Выбор зависит от гибкости проекта и требований к пользователям.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍5❤1
Моржовый оператор (
:=
) – это новый оператор, появившийся в Python 3.8, который позволяет присваивать значение переменной прямо внутри выражения. Обычно мы записываем код так:
value = len(my_list) # Сначала присваиваем
if value > 10: # Потом используем
print("Список большой")
С
:=
можно совместить оба действия if (value := len(my_list)) > 10:
print("Список большой")
В циклах (избегаем лишних вычислений). Вместо:
data = input("Введите строку: ")
while data != "exit":
print("Вы ввели:", data)
data = input("Введите строку: ")
С
:=
можно записать короче:while (data := input("Введите строку: ")) != "exit":
print("Вы ввели:", data)
В
if
и while
(проверяем и присваиваем одновременно) Без
:=
text = input("Введите слово: ")
if len(text) > 5:
print(f"Слово длинное ({len(text)} символов)")
С
:=
:if (length := len(text)) > 5:
print(f"Слово длинное ({length} символов)")
В списковых включениях (list comprehensions)
Без
:=
:numbers = [random.randint(1, 100) for _ in range(10)]
filtered = [num for num in numbers if num % 2 == 0]
С
:=
:filtered = [num for _ in range(10) if (num := random.randint(1, 100)) % 2 == 0]
Если код становится сложнее для чтения
if (a := func()) and (b := another_func(a)) > 10:
...
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21💊9🤯1
Кастомная авторизация реализуется через настройку модели пользователя и аутентификацию. Для этого можно:
- Создать свою модель пользователя, унаследовавшись от AbstractUser или AbstractBaseUser
- Настроить бэкенд аутентификации, создав кастомный класс и переопределив authenticate
- Добавить JWT-токены с помощью SimpleJWT или другого механизма токенов
Это позволяет гибко управлять логикой авторизации, например, по email вместо имени пользователя.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3
В Docker
volume
(том) — это специальное место для хранения данных контейнера, которое не исчезает при перезапуске или удалении контейнера. Данные не теряются при удалении контейнера
Общий доступ: несколько контейнеров могут использовать один и тот же
volume
Производительность: тома быстрее, чем хранение внутри контейнера
Разделение кода и данных: удобно для баз данных и логов
Способ 1: Автоматическое создание при запуске контейнера
docker run -d -v my_volume:/app/data my_container
Способ 2: Создать том отдельно и подключить его
docker volume create my_volume
docker run -d -v my_volume:/app/data my_container
Способ 3: Использовать путь на хосте (bind-mount)
docker run -d -v /home/user/data:/app/data my_container
docker volume ls # Покажет все тома
docker volume inspect my_volume # Информация о томе
Важно: при удалении тома данные удаляются безвозвратно!
docker volume rm my_volume # Удаление одного тома
docker volume prune # Удаление всех неиспользуемых томов
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Изначально не поддерживает WebSocket, но для работы с ним используется Django Channels. Это асинхронное дополнение к Django, позволяющее:
- Создавать WebSocket-соединения
- Обрабатывать события в реальном времени
- Использовать Consumers аналогично Views
Для работы с Django Channels требуется Redis как брокер сообщений.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍10
В Python есть встроенные функции (built-in functions) — это функции, которые можно использовать без импорта. Они делают код проще и удобнее.
Полный список встроенных функций можно посмотреть так:
print(dir(__builtins__))
Работа с числами
print(abs(-5)) # 5
print(round(3.14159, 2)) # 3.14
print(pow(2, 3)) # 8
print(min([3, 1, 4])) # 1
Работа со строками
print(len("hello")) # 5
print(str(123)) # '123'
print(ord('A')) # 65
print(chr(65)) # 'A'
Работа с коллекциями (списки, кортежи, множества)
a = [3, 1, 2]
print(sorted(a)) # [1, 2, 3]
nums = [1, 2, 3]
names = ["Alice", "Bob", "Charlie"]
print(list(zip(nums, names))) # [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]
Работа с логикой и проверками
print(bool("")) # False
print(all([True, 1, "Hello"])) # True
print(any([0, "", None, 5])) # True (есть хотя бы один True)
Работа с функциями
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9, 16]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]
Работа с файлами
with open("file.txt", "w") as f:
f.write("Hello, world!")
name = input("Введите имя: ")
print("Привет,", name)
Работа с объектами и атрибутами
print(type(42)) # <class 'int'>
print(isinstance(42, int)) # True
print(dir([])) # Методы списка
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1
Это подход в Django, когда бизнес-логика приложения хранится в моделях. Вместо того, чтобы помещать логику в представления (views) или сериализаторы (serializers), её выносят в модели, добавляя:
- Методы для обработки данных
- Логику валидации и вычислений
- Кастомные save() методы
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍2
Конструкция
try...finally
используется в случаях, когда нужно гарантировать выполнение кода в finally
, независимо от того, возникло исключение или нет. Если файл открыт, его нужно закрыть в любом случае, даже если в процессе работы произойдёт ошибка.
try:
file = open("data.txt", "r")
data = file.read()
finally:
print("Закрываем файл...")
file.close() # Файл закроется даже при ошибке
Если программа работает с базой данных, соединение нужно закрыть, даже если произошла ошибка.
import sqlite3
conn = sqlite3.connect("database.db")
try:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users") # Ошибка, если таблицы нет
finally:
print("Закрываем соединение с БД...")
conn.close() # Закроет соединение в любом случае
Допустим, есть блокировка файла, которую нужно снять в любом случае.
import threading
lock = threading.Lock()
try:
lock.acquire()
print("Ресурс заблокирован")
# Код, который использует ресурс
finally:
print("Разблокируем ресурс")
lock.release() # Освободит блокировку даже при ошибке
Пример 4: Остановка таймера, даже если произошла ошибка
import time
try:
start_time = time.time()
x = 1 / 0 # Ошибка деления на ноль
finally:
elapsed_time = time.time() - start_time
print(f"Программа выполнялась {elapsed_time:.2f} секунд")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Выбор зависит от типа логики:
- В моделях хранят бизнес-логику, связанную с данными (валидация, вычисления, обработка)
- В сериализаторах хранят логику, связанную с API (конвертация данных, валидация полей)
Если логика нужна в нескольких местах, лучше разместить её в моделях.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊10👍3
Модуль
datetime
позволяет работать с датами и временем, но по умолчанию он не поддерживает часовые пояса.from datetime import datetime
dt = datetime.now() # Получаем текущую дату и время
print(dt) # Например: 2024-02-28 14:30:00.123456
print(dt.tzinfo) # None (нет информации о часовом поясе)
Библиотека
pytz
добавляет поддержку часовых поясов и позволяет работать с разными временными зонами. from datetime import datetime
import pytz
tz = pytz.timezone("Europe/Moscow") # Часовой пояс Москвы
dt = datetime.now(tz) # Получаем текущее время с учетом часового пояса
print(dt) # Например: 2024-02-28 17:30:00+03:00
print(dt.tzinfo) # Europe/Moscow
Создание
datetime
с часовым поясом pytz
dt = datetime(2024, 2, 28, 15, 0) # Наивная дата
tz = pytz.timezone("Europe/Moscow")
dt = tz.localize(dt) # Присваиваем часовой пояс
print(dt) # 2024-02-28 15:00:00+03:00
Конвертация времени между часовыми поясами
ny_tz = pytz.timezone("America/New_York")
ny_time = dt.astimezone(ny_tz)
print(ny_time) # Конвертированное время в Нью-Йорке
Использование UTC (лучший подход для серверов)
utc_now = datetime.now(pytz.UTC) # Текущее время в UTC
print(utc_now) # Например: 2024-02-28 14:30:00+00:00
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💊3
Модели представляют структуру базы данных. Основные типы моделей:
- Обычные (models.Model) — стандартные таблицы базы
- Абстрактные (AbstractModel) — базовые классы без создания таблиц
- Proxy-модели — позволяют изменять поведение без изменения схемы
- Many-to-Many модели — используются для связи ManyToManyField
Каждая модель соответствует одной таблице в базе.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍2
Рекурсия — это мощный инструмент, но в Python она имеет ограничения, которые нужно учитывать при написании кода.
В Python по умолчанию рекурсия ограничена 1000 вызовами, чтобы избежать переполнения стека.
import sys
print(sys.getrecursionlimit()) # 1000 (обычное значение)
Если превысить этот лимит, программа вызовет ошибку
def recursive():
return recursive()
recursive() # RecursionError: maximum recursion depth exceeded
Можно увеличить глубину рекурсии, но это небезопасно
sys.setrecursionlimit(2000) # Увеличиваем до 2000
Каждый рекурсивный вызов создаёт новый фрейм в стеке вызовов.
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(10000)) # Ошибка из-за переполнения стека
Другие языки (например, Lisp, JavaScript) автоматически оптимизируют хвостовую рекурсию (Tail Call Optimization, TCO).
Python не делает этого, поэтому даже "идеальная" рекурсия всё равно переполняет стек.
def tail_recursive(n, acc=1):
if n == 1:
return acc
return tail_recursive(n - 1, n * acc)
print(tail_recursive(1000)) # Всё равно вызовет RecursionError
Рекурсивный вызов требует больше накладных расходов (создание стек-фреймов), чем обычный
for
или while
.# Итеративный вариант (быстрее)
def factorial_iter(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
# Рекурсивный вариант (медленнее)
def factorial_rec(n):
if n == 1:
return 1
return n * factorial_rec(n - 1)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💊2
Это основа Django ORM. Это Python-классы, которые представляют таблицы базы данных. Внутри моделей определяются поля, методы и связи между объектами. Django автоматически создаёт SQL-запросы на основе моделей.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2
В Python
@
используется для декораторов, и разница между @foobar
и @foobar()
заключается в том, вызывается ли сам декоратор с параметрами или без.Если мы пишем
@foobar
, то используется сам декоратор как есть, без передачи аргументов.def foobar(func):
def wrapper():
print("Декоратор вызван!")
return func()
return wrapper
@foobar # Просто передаём функцию в декоратор
def hello():
print("Hello, world!")
hello()
Вывод
Декоратор вызван!
Hello, world!
Если декоратор принимает параметры, то он сначала вызывается (
foobar()
), а потом возвращает сам декоратор.def foobar(arg):
def decorator(func):
def wrapper():
print(f"Декоратор вызван с аргументом: {arg}")
return func()
return wrapper
return decorator
@foobar("Привет") # Вызываем foobar("Привет"), который вернёт реальный декоратор
def hello():
print("Hello, world!")
hello()
Вывод
Декоратор вызван с аргументом: Привет
Hello, world!
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13💊6
Создание объекта можно выполнить через:
- Метод create() — Model.objects.create(name="Example")
- Создание экземпляра и save() —
- obj = Model(name="Example")
-
- Использование get_or_create() — создаёт объект, если он отсутствует
ORM Django упрощает взаимодействие с базой, используя Python-классы вместо SQL-запросов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Forwarded from easyoffer
На easyoffer 2.0 появится:
🎯 Тренажер "Проработка вопросов"
✅ Метод интервальных повторений и флеш-карточки
✅ Персональный подход изучения на основе ваших ответов
✅ Упор на самые частые вопросы
📌 Интервальные повторения по карточкам это научно доказанный метод эффективного обучения. Каждая карточка – это вопрос, который задают на собеседовании, вы можете выбрать "Не знаю", "Знаю", "Не спрашивать". После ответа вам показывается правильный ответ и возможность изучить вопрос подробнее (примеры ответов других людей). От ваших ответов зависит то, как часто карточки будут показываться на следующей тренировке. Трудные вопросы показываются чаще, простые – реже. Это позволяет бить в слабые места. Кроме того, изначальный порядок карточек зависит от частотности (вероятности встретить вопрос).
🚀 Благодаря этому тренажеру вы сможете очень быстро подготовиться к собеседованию, т.к. фокусируетесь отвечать на самые частые вопросы. Именно так готовился я сам, когда искал первую работу программистом.
Уже в течение недели я объявлю о старте краудфандинговой кампании на сбор финансирования, чтобы ускорить разработку сайта. Все кто поддержит проект до официального релиза получат самые выгодные условия пользования сервисом. А именно 1 год доступа к сайту по цене месячной подписки.
‼️ Очень важно, чтобы как можно больше людей поддержали проект в первые дни, по-этому те кто окажет поддержку первыми получат еще более выгодную стоимость на годовую подписку и существенный💎 бонус о котором я позже расскажу в этом телеграм канале. Подписывайтесь, чтобы узнать о старте проекта раньше других и воспользоваться лимитированными вознаграждениями.
🎯 Тренажер "Проработка вопросов"
✅ Метод интервальных повторений и флеш-карточки
✅ Персональный подход изучения на основе ваших ответов
✅ Упор на самые частые вопросы
📌 Интервальные повторения по карточкам это научно доказанный метод эффективного обучения. Каждая карточка – это вопрос, который задают на собеседовании, вы можете выбрать "Не знаю", "Знаю", "Не спрашивать". После ответа вам показывается правильный ответ и возможность изучить вопрос подробнее (примеры ответов других людей). От ваших ответов зависит то, как часто карточки будут показываться на следующей тренировке. Трудные вопросы показываются чаще, простые – реже. Это позволяет бить в слабые места. Кроме того, изначальный порядок карточек зависит от частотности (вероятности встретить вопрос).
🚀 Благодаря этому тренажеру вы сможете очень быстро подготовиться к собеседованию, т.к. фокусируетесь отвечать на самые частые вопросы. Именно так готовился я сам, когда искал первую работу программистом.
Уже в течение недели я объявлю о старте краудфандинговой кампании на сбор финансирования, чтобы ускорить разработку сайта. Все кто поддержит проект до официального релиза получат самые выгодные условия пользования сервисом. А именно 1 год доступа к сайту по цене месячной подписки.
‼️ Очень важно, чтобы как можно больше людей поддержали проект в первые дни, по-этому те кто окажет поддержку первыми получат еще более выгодную стоимость на годовую подписку и существенный
Please open Telegram to view this post
VIEW IN TELEGRAM