Они позволяют централизованно управлять созданием классов. Это полезно при создании фреймворков, проверке структур, логировании и генерации кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Это небольшой файл, который создаётся веб-сайтом и сохраняется в браузере пользователя. Куки используются для хранения информации, связанной с пользователем, чтобы улучшить его взаимодействие с сайтом.
Куки помогают веб-сайтам «запоминать» данные о пользователе. Вот основные цели их использования:
Например, после входа в аккаунт куки сохраняют ваш статус (авторизован вы или нет).
Куки могут хранить ваши настройки, например, выбранный язык или тему сайта.
Если вы добавляете товары в корзину в интернет-магазине, эта информация может храниться в куки.
Куки используются для аналитики и рекламы, чтобы понять, как вы взаимодействуете с сайтом, или показать персонализированные объявления.
Когда вы заходите на сайт, сервер может отправить куки вашему браузеру вместе с HTTP-ответом.
Браузер сохраняет эти данные и отправляет их обратно на сервер при последующих запросах.
Куки привязаны к домену, и только этот домен может их читать.
Создание куки на сервере (Python, Flask)
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie():
response = make_response("Cookie установлена!")
response.set_cookie('username', 'JohnDoe') # Устанавливаем куки с именем "username"
return response
@app.route('/get_cookie')
def get_cookie():
username = request.cookies.get('username') # Получаем значение куки
return f'Привет, {username}!' if username else 'Куки не найдены.'
if __name__ == '__main__':
app.run(debug=True)
Хранятся только во время работы браузера и удаляются после его закрытия.
Сохраняются на устройстве пользователя до истечения срока действия.
Передаются только через HTTPS для обеспечения безопасности.
Не доступны через JavaScript, используются для защиты от XSS-атак.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Минимально возможный интервал — одна минута. То есть cron может запускать задачу раз в минуту, но не чаще. Для меньших интервалов используются другие инструменты — например, systemd timers или сторонние планировщики.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤔1
Блокировка (lock) — это механизм, который предотвращает одновременный доступ к данным разными транзакциями, чтобы избежать конфликтов, повреждения данных или "гонки" процессов.
Представь, что два человека редактируют один и тот же документ. Если они начнут менять его одновременно, файл может испортиться. Блокировки в БД работают так же — если один процесс изменяет данные, другой должен подождать, пока первый закончит.
предотвращает одновременные изменения одних и тех же строк.
когда два запроса пытаются изменить одно и то же значение.
разные операции не мешают друг другу.
Строчная (Row Lock) – блокирует только одну строку таблицы.
Табличная (Table Lock) – блокирует всю таблицу целиком.
Блокировка всей базы (Database Lock) – редко используется, но блокирует всю БД.
BEGIN;
SELECT * FROM users WHERE id = 1 FOR UPDATE; -- Блокирует строку, пока транзакция не завершится
Эксклюзивная (Exclusive, X-Lock) – блокирует запись для всех (никакие другие операции её не изменят).
Разделяемая (Shared, S-Lock) – блокирует только на запись (чтение возможно).
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
-- Пока транзакция не завершится, другая транзакция не сможет изменить balance пользователя 1.
Явные (ручные) – задаются программистом (
SELECT ... FOR UPDATE
). Неявные (автоматические) – создаются СУБД при
INSERT
, UPDATE
, DELETE
. Если два запроса ждут друг друга, система "зависает". Решение: правильный порядок выполнения транзакций.
Если транзакция не закрывается (
COMMIT
/ROLLBACK
), другие запросы ждут бесконечно. Решение: короткие транзакции, автоматическое завершение. Чем больше блокировок, тем медленнее работа БД.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Асинхронность в Python используется для эффективной работы с задачами, которые тратят время на ожидание, например:
- сетевые запросы;
- операции с файлами;
- задержки по времени;
- работа с базами данных.
Асинхронный код (async/await) позволяет выполнять другие действия во время ожидания, не блокируя основной поток. Это особенно полезно в веб-серверах, чат-ботах, API и других IO-bound задачах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Если нужно:
Перехватить исключение
Выполнить какие-то действия (лог, очистка, уведомление и т. д.)
Снова выбросить это же исключение
try:
x = 1 / 0 # Ошибка деления на ноль
except ZeroDivisionError:
print("Ошибка! Записываем в лог...")
raise # Повторно выбрасываем то же исключение
Вывод
Ошибка! Записываем в лог...
Traceback (most recent call last):
File "script.py", line 2, in <module>
x = 1 / 0
ZeroDivisionError: division by zero
Пример: Логирование перед повторным выбросом
import logging
logging.basicConfig(filename="errors.log", level=logging.ERROR)
try:
user_input = int("abc") # Ошибка ValueError
except ValueError as e:
logging.error(f"Ошибка: {e}") # Записываем в лог
raise # Повторно выбрасываем исключение
Пример: Очистка ресурсов перед выбросом исключения
try:
file = open("data.txt", "r")
data = file.read()
except FileNotFoundError:
print("Файл не найден. Освобождаем ресурсы...")
raise # Снова выбрасываем исключение
finally:
file.close() # Гарантированно закроет файл
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
2. Read Committed: транзакция видит только завершённые изменения других транзакций.
3. Repeatable Read: транзакция видит данные на момент её начала и игнорирует изменения других транзакций.
4. Serializable: самый строгий уровень, который предотвращает любые конфликты и гарантирует полную изоляцию.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Статические методы (static methods) в Python используются для создания методов, которые связаны с классом, но не требуют доступа к экземпляру этого класса или к самим данным класса. Это методы, которые выполняют функции, связанные с классом, но не изменяют и не используют состояние экземпляра (атрибуты объекта) или состояние самого класса (атрибуты класса). Они могут быть вызваны на уровне класса, а не на уровне экземпляра класса.
Для создания статического метода в Python используется декоратор
@staticmethod
. Давайте рассмотрим пример:class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
Вы можете вызывать статический метод как через сам класс, так и через его экземпляр:
result = MyClass.static_method(5, 10)
print(result) # Вывод: 15
my_instance = MyClass()
result = my_instance.static_method(3, 7)
print(result) # Вывод: 10
Статические методы позволяют логически группировать функции, которые связаны с классом, но не зависят от состояния конкретного экземпляра. Это помогает организовать код и делает его более читабельным.
Иногда полезно вызывать метод, не создавая экземпляр класса. Например, если метод выполняет какую-то утилитарную функцию или обрабатывает данные, не связанные с объектом.
Поскольку статические методы не могут изменять состояние экземпляра или класса, их использование может способствовать созданию безопасного и предсказуемого кода.
Методы экземпляра (instance methods) принимают первым аргументом
self
, что позволяет им изменять состояние конкретного экземпляра класса. class MyClass:
def instance_method(self, value):
self.value = value
Методы класса (class methods) принимают первым аргументом
cls
, что позволяет им изменять состояние самого класса. class MyClass:
class_variable = 0
@classmethod
def class_method(cls, value):
cls.class_variable = value
Статические методы не принимают
self
или cls
в качестве первого аргумента и не могут изменять состояние экземпляра или класса. class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Потому что Python-словарь реализован как хеш-таблица, где каждый ключ хешируется, и по хешу сразу находится нужный слот в массиве. Это позволяет избегать линейного перебора и получать значение напрямую.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Когда пользователь отправляет HTTP-запрос (например, открывает страницу сайта), Django проходит несколько этапов обработки, прежде чем вернуть ответ.
Когда клиент (браузер, API) отправляет запрос, его принимает WSGI/ASGI-сервер (
Gunicorn
, Daphne
). Если проект синхронный → работает через WSGI (
wsgi.py
). Если проект асинхронный → через ASGI (
asgi.py
). GET /hello/ HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Django превращает HTTP-запрос в объект
HttpRequest
, который передаётся в view
. def my_view(request):
print(request.iss.onethod) # 'GET'
print(request.path) # '/hello/'
print(request.GET) # {'name': 'Alice'}
Прежде чем запрос дойдёт до
view
, Django проходит через мидлвари, которые могут: Проверять авторизацию (
AuthenticationMiddleware
). Защищать от CSRF (
CsrfViewMiddleware
). Перенаправлять запросы (
CommonMiddleware
). MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
]
Django ищет, какая функция (
view
) должна обработать этот URL. from django.urls import path
from myapp.views import hello_view
urlpatterns = [
path("hello/", hello_view), # Запрос "/hello/" попадёт в hello_view
]
Когда Django находит подходящее представление (
view
), оно вызывается. from django.http import HttpResponse
def hello_view(request):
return HttpResponse("Привет, мир!")
Django берёт
HttpResponse
и передаёт его обратно через middleware
(например, сжатие, защита, заголовки безопасности). HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 12
Привет, мир!
На последнем этапе WSGI/ASGI-сервер отправляет ответ обратно браузеру или API-клиенту.
Клиент (браузер) → WSGI/ASGI → Django Middleware → URL Dispatcher → View → Response → Клиент
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤔1
Асинхронный контекстный менеджер (async with) работает с асинхронными ресурсами: подключениями, файлами и т.д. Он должен реализовывать методы aenter и aexit. В отличие от синхронного (with), он не блокирует event loop и позволяет выполнять I/O без задержек.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2