Потому что Python-словарь реализован как хеш-таблица, где каждый ключ хешируется, и по хешу сразу находится нужный слот в массиве. Это позволяет избегать линейного перебора и получать значение напрямую.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Когда пользователь отправляет 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
👍5🤔1
Асинхронный контекстный менеджер (async with) работает с асинхронными ресурсами: подключениями, файлами и т.д. Он должен реализовывать методы aenter и aexit. В отличие от синхронного (with), он не блокирует event loop и позволяет выполнять I/O без задержек.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3
Асинхронность в Python позволяет не блокировать выполнение программы во время ожидания операций ввода-вывода (I/O). Это делает её намного быстрее в задачах, где программа тратит много времени на ожидание (например, загрузка файлов, работа с сетью, запросы к базам данных).
В обычном (синхронном) коде каждая операция ждёт завершения предыдущей.
import requests
import time
start = time.time()
def fetch(url):
response = requests.get(url) # Ждём ответа от сервера
return response.text
urls = ["https://example.com"] * 3
for url in urls:
fetch(url) # Ждём каждый запрос
print("Время выполнения:", time.time() - start)
Асинхронность в Python использует event loop (цикл событий), который позволяет не ждать выполнения операции, а переключаться на другие задачи.
import asyncio
import aiohttp
import time
start = time.time()
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com"] * 3
tasks = [fetch(url) for url in urls]
await asyncio.gather(*tasks) # Запускаем все запросы одновременно
asyncio.run(main())
print("Время выполнения:", time.time() - start)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это техника, при которой функция с несколькими аргументами преобразуется в цепочку функций, каждая из которых принимает один аргумент. Это удобно для частичного применения и повышения абстракции.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Чтобы реализовать метод
__new__
для создания класса по шаблону Singleton, нужно следовать принципам, которые обеспечивают создание только одного экземпляра класса. Метод new отвечает за создание нового экземпляра класса, и его можно использовать для контроля этого процесса. Ниже приведен пример реализации Singleton с использованием метода new.class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls, args, kwargs)
return cls._instance
def __init__(self, value):
if not hasattr(self, 'initialized'):
self.value = value
self.initialized = True
# Проверка работы Singleton
singleton1 = Singleton(10)
singleton2 = Singleton(20)
print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 10
print(singleton2.value) # Выведет: 10
Атрибут _instance
cls._instance
используется для хранения единственного экземпляра класса.Метод
e):
Метод init выполняет инициализацию экземпляра.
Чтобы избежать повторной инициализации, проверяется наличие атрибута
initialized
. Если он не существует, происходит инициализация атрибутов и устанавливается initialized = True
.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Docker кеширует слои, созданные каждой инструкцией Dockerfile. При повторной сборке, если инструкция и её контекст не изменились, Docker использует сохранённый слой из кеша. Это ускоряет сборку и снижает нагрузку на ресурсы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4