Python | Вопросы собесов
13.8K subscribers
35 photos
1 file
945 links
Download Telegram
🤔 Что такое cookie?

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

🚩Зачем нужны куки?

Куки помогают веб-сайтам «запоминать» данные о пользователе. Вот основные цели их использования:
🟠Аутентификация
Например, после входа в аккаунт куки сохраняют ваш статус (авторизован вы или нет).
🟠Сохранение предпочтений
Куки могут хранить ваши настройки, например, выбранный язык или тему сайта.
🟠Сессии и корзины
Если вы добавляете товары в корзину в интернет-магазине, эта информация может храниться в куки.
🟠Отслеживание действий
Куки используются для аналитики и рекламы, чтобы понять, как вы взаимодействуете с сайтом, или показать персонализированные объявления.

🚩Как работают куки?

Когда вы заходите на сайт, сервер может отправить куки вашему браузеру вместе с 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)


🚩Типы куки

🟠Сессионные куки (Session Cookies)
Хранятся только во время работы браузера и удаляются после его закрытия.
🟠Постоянные куки (Persistent Cookies)
Сохраняются на устройстве пользователя до истечения срока действия.
🟠Безопасные куки (Secure Cookies)
Передаются только через HTTPS для обеспечения безопасности.
🟠HttpOnly куки
Не доступны через JavaScript, используются для защиты от XSS-атак.

🚩Плюсы и минусы

Помогают сохранять пользовательские данные для упрощения работы с сайтом.
Могут улучшить пользовательский опыт за счёт персонализации.
Могут использоваться для отслеживания активности (privacy concerns).
Неправильное управление куки может привести к утечкам данных.

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

Минимально возможный интервал — одна минута. То есть cron может запускать задачу раз в минуту, но не чаще. Для меньших интервалов используются другие инструменты — например, systemd timers или сторонние планировщики.


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

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

🚩Почему нужны блокировки?

🟠Гарантия целостности данных
предотвращает одновременные изменения одних и тех же строк.
🟠Избегание гонки данных (race condition)
когда два запроса пытаются изменить одно и то же значение.
🟠Изоляция транзакций
разные операции не мешают друг другу.

🚩Виды блокировок в БД

🟠По уровню охвата данных
Строчная (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.

🚩Проблемы с блокировками

🟠Deadlock (взаимная блокировка)
Если два запроса ждут друг друга, система "зависает". Решение: правильный порядок выполнения транзакций.

🟠Долгие блокировки
Если транзакция не закрывается (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
🤔 Какие есть уровни изоляции транзакций?

1. Read Uncommitted: транзакция может видеть несохранённые изменения других транзакций (грязное чтение).
2. Read Committed: транзакция видит только завершённые изменения других транзакций.
3. Repeatable Read: транзакция видит данные на момент её начала и игнорирует изменения других транзакций.
4. Serializable: самый строгий уровень, который предотвращает любые конфликты и гарантирует полную изоляцию.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Для чего нужны static method?

Статические методы (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
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Объясни как происходит обработка HTTP запросов на Django

Когда пользователь отправляет HTTP-запрос (например, открывает страницу сайта), Django проходит несколько этапов обработки, прежде чем вернуть ответ.

🚩Подробный разбор обработки HTTP-запроса в Django

🟠Запрос приходит в WSGI/ASGI сервер
Когда клиент (браузер, 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 создаёт `HttpRequest` объект
Django превращает HTTP-запрос в объект HttpRequest, который передаётся в view.
def my_view(request):
print(request.iss.onethod) # 'GET'
print(request.path) # '/hello/'
print(request.GET) # {'name': 'Alice'}


🟠Middleware (промежуточная обработка)
Прежде чем запрос дойдёт до 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",
]


🟠Поиск `view` в `urls.py`
Django ищет, какая функция (view) должна обработать этот URL.
from django.urls import path
from myapp.views import hello_view

urlpatterns = [
path("hello/", hello_view), # Запрос "/hello/" попадёт в hello_view
]


🟠Выполнение `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 сервер отправляет ответ клиенту
На последнем этапе WSGI/ASGI-сервер отправляет ответ обратно браузеру или API-клиенту.


🚩Краткая схема обработки запроса

Клиент (браузер) → WSGI/ASGI → Django Middleware → URL Dispatcher → View → Response → Клиент


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔1
🤔 Чем отличается асинхронный контекстный менеджер от синхронного?

Асинхронный контекстный менеджер (async with) работает с асинхронными ресурсами: подключениями, файлами и т.д. Он должен реализовывать методы aenter и aexit. В отличие от синхронного (with), он не блокирует event loop и позволяет выполнять I/O без задержек.


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