RESTful — это термин, обозначающий API, реализующее принципы REST.
Такой API:
- работает с ресурсами;
- использует понятные URL;
- использует HTTP-методы по назначению (например, GET для получения, POST для создания);
- возвращает стандартизированные ответы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔2💊2
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
объект можно передавать как параметр функции.
функция может возвращать объект.
объект можно создавать во время выполнения программы (не только на этапе компиляции).
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
Присваивание функции переменной
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
Связь 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-заголовки, которые указывают, как долго хранить данные и когда обновлять их.
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: "abc123"
При следующем запросе браузер отправляет
If-None-Match: If-None-Match: "abc123"
Если ресурс не изменился, сервер отвечает
304 Not Modified (клиент использует кэш). Если ресурс изменился — сервер отправляет новую версию.
HTTP/1.1 304 Not 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
Если ресурс зависит от заголовков (
User-Agent, Accept-Encoding), используем Vary.Vary: User-Agent
Если сервер отправил старый кэш, можно обновить ресурс с новым 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 миграции используются для изменения структуры базы данных (создание, изменение и удаление таблиц и полей).
Пример модели пользователя:
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
После генерации нужно применить миграции к базе данных:
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
Если нужно откатить последнее изменение:
python manage.py migrate myapp 0001 # Откат до первой миграции
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
В Python нет конструкции do-while, и любой цикл (for, while) требует двоеточия в конце строки. Без него будет синтаксическая ошибка.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊13👍5
Middleware (промежуточное ПО) — это специальные классы, которые обрабатывают запросы и ответы, проходящие через Django. Они позволяют изменять данные, проверять доступ, логировать действия и многое другое.
Добавляет важные HTTP-заголовки для защиты сайта:
-
Strict-Transport-Security (HTTPS) -
X-Content-Type-Options: nosniff -
X-Frame-Options: DENY Отвечает за:
Перенаправление с
APPEND_SLASH=True (если /about → перенаправит на /about/). Удаление
www. (www.example.com → example.com). Обработка кодировки и контента.
Позволяет Django хранить данные пользователя между запросами (например, авторизацию).
request.session["user_id"] = 42 # Сохраняем ID пользователя в сессии
Позволяет работать с
request.user, автоматически определяя пользователя. if request.user.is_authenticated:
print(f"Пользователь: {request.user.username}")
Защищает от атак межсайтовой подделки запросов (CSRF).
При обработке форм Django требует специальный CSRF-токен:
<form method="POST">
{% csrf_token %}
<input type="text" name="name">
</form>
Запрещает встраивать сайт в
<iframe>, предотвращая атаку Clickjacking. X-Frame-Options: DENY
Позволяет передавать временные сообщения (
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
Ветку обычно создают от:
- develop — если это новая фича.
- release — если багфикс в рамках релиза.
- main или master — если срочный хотфикс.
Важно выбирать стабильную и актуальную базу для дальнейшей работы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3
Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
Когда необходимо контролировать доступ к ресурсу.
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
Для управления ресурсами, такими как память или сетевые соединения.
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
Контролирует доступ к объекту, создавая его по требованию.
Контролирует доступ к объекту, ограничивая права пользователей.
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
Кэширует результаты запросов к объекту для повышения производительности.
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
Proxy контролирует доступ к классу RealSubject, добавляя проверку доступа и логирование.from abc import ABC, abstractmethod
class Subject(ABC):
@abstractmethod
def request(self):
pass
class RealSubject(Subject):
def request(self):
print("Реальный объект: Обработка запроса.")
class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject
def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()
def check_access(self):
print("Заместитель: Проверка доступа перед выполнением запроса.")
return True
def log_access(self):
print("Заместитель: Логирование времени запроса.")
# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)
proxy.request()
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊3🔥1
Разбить список (
list) можно разными способами в зависимости от задачи: На части фиксированной длины
На N частей
По условию
Если нужно разделить список на подсписки длиной
n, можно использовать list comprehensiondef split_list(lst, size):
return [lst[i:i + size] for i in range(0, len(lst), size)]
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_list(data, 3))
Вывод
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Если нужно разделить список на
N частей, можно использовать numpy или itertools import numpy as np
def split_into_n_parts(lst, n):
return np.array_split(lst, n)
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_into_n_parts(data, 4))
Вывод
[array([1, 2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
Если нужно разделить список по какому-то критерию, например, на чётные и нечётные числа
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even = [x for x in data if x % 2 == 0]
odd = [x for x in data if x % 2 != 0]
print(even, odd)
Вывод
[2, 4, 6, 8] [1, 3, 5, 7, 9]
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
1. Тип переменной определяется во время выполнения, а не во время компиляции.
2. Это позволяет переменной менять тип в процессе выполнения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1
Словарь (
dict) — это структура данных, которая хранит пары "ключ → значение". Через
{} (фигурные скобки)my_dict = {"name": "Alice", "age": 25, "city": "New York"}Изменение значения
my_dict["age"] = 26 # Меняем возраст
del — удаление по ключуdel my_dict["city"]
Перебор ключей (
for key in dict)for key in my_dict:
print(key, my_dict[key])
Проверка наличия ключа
if "name" in my_dict:
print("Ключ существует!")
Создадим словарь квадратов чисел
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}Нельзя использовать
list как ключ! my_dict[[1, 2, 3]] = "Ошибка" # TypeError: unhashable type: 'list'
Можно использовать
tuple, int, str, frozensetmy_dict[(1, 2, 3)] = "OK"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3💊1
Можно использовать системные утилиты, которые выводят сведения об объёме оперативной памяти, её использовании и свободном объёме.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊32🤔5👍2
git stash — это команда в Git, которая сохраняет незакоммиченные изменения во временное хранилище (stash) и очищает рабочую директорию. Нужно переключиться на другую ветку, но есть незаконченные изменения. Хочешь сохранить текущую работу, но не коммитить её. Нужно экспериментировать, но без риска потерять код.
Сохранить изменения в
stash git stash
Посмотреть список сохранённых изменений
git stash list
Выведет список всех
stash-ов stash@{0}: WIP on main: 1234567 Добавил новую фичу
stash@{1}: WIP on dev: 89abcde Исправил багВосстановить сохранённые изменения
git stash pop # Восстановит изменения и удалит stash
ИЛИ
git stash apply # Восстановит, но stash останется в списке
Удалить
stash после применения git stash drop stash@{0} # Удалит конкретный stash
git stash clear # Удалит все stash'иСценарий
- Ты работаешь в ветке
main, но нужно срочно переключиться на dev. - У тебя есть изменения, которые ты не хочешь коммитить.
Решение
git stash # Сохраняем изменения
git checkout dev # Переключаемся на другую ветку
# Делаем нужную работу...
git checkout main # Возвращаемся в основную ветку
git stash pop # Восстанавливаем изменения
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10💊1
– Через оператор % (устаревший стиль).
– Метод .format().
– f-строки (f"{переменная}").
– Конкатенация (+), если речь не о форматировании, а о сложении.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Хранение данных базы данных (SQL) внутри Docker-контейнера не рекомендуется, потому что контейнеры являются временными и одноразовыми. При удалении или пересоздании контейнера все данные внутри него теряются.
Контейнеры в Docker спроектированы так, чтобы их можно было легко пересоздавать. Если удалить контейнер (
docker rm), все данные, хранящиеся внутри него, исчезнут навсегда. docker run --name mydb -e MYSQL_ROOT_PASSWORD=secret -d mysql
docker stop mydb
docker rm mydb # Удаляем контейнер – все данные пропали!
Если база данных хранится внутри контейнера, обновить версию MySQL/PostgreSQL будет сложно. При пересоздании контейнера все данные потеряются, и их придется восстанавливать из резервной копии.
Хранение данных внутри контейнера может снизить скорость работы базы, потому что Docker использует копию на запись (Copy-on-Write, CoW).
Решение — использовать прямые тома (volumes) или монтировать каталог хоста.
docker run --name mydb -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret -d mysql
Если база находится внутри контейнера, то сделать бэкап или восстановить данные сложно.
Лучшее решение: использовать volumes + делать бэкапы через
mysqldump или pg_dump. docker exec mydb mysqldump -u root -psecret mydatabase > backup.sql
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
- re.match() проверяет только начало строки на соответствие шаблону. Если начало не совпадает — возвращает None.
-
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
🤔 Какие есть коды ошибок HTTP?
В HTTP коды состояния указывают, как сервер обработал запрос. Они делятся на 5 категорий:
1xx (Информационные – запрос принят, продолжаем.
2xx (Успешные) – всё хорошо.
3xx (Перенаправления) – запрашиваемый ресурс перемещён.
4xx (Ошибки клиента) – клиент отправил неправильный запрос.
5xx (Ошибки сервера) – сервер не смог обработать запрос.
🚩Как исправить ошибки HTTP?
4xx:
400: Проверить формат запроса.
401: Убедиться, что пользователь авторизован.
403: Проверить права доступа.
404: Убедиться, что URL правильный.
5xx:
500: Проверить код сервера (ошибки в логах).
502/504: Проверить настройки Nginx/Proxy.
503: Сервер перегружен → добавить балансировку нагрузки.
Ставь 👍 и забирай 📚 Базу знаний
В HTTP коды состояния указывают, как сервер обработал запрос. Они делятся на 5 категорий:
1xx (Информационные – запрос принят, продолжаем.
2xx (Успешные) – всё хорошо.
3xx (Перенаправления) – запрашиваемый ресурс перемещён.
4xx (Ошибки клиента) – клиент отправил неправильный запрос.
5xx (Ошибки сервера) – сервер не смог обработать запрос.
🚩Как исправить ошибки HTTP?
4xx:
400: Проверить формат запроса.
401: Убедиться, что пользователь авторизован.
403: Проверить права доступа.
404: Убедиться, что URL правильный.
5xx:
500: Проверить код сервера (ошибки в логах).
502/504: Проверить настройки Nginx/Proxy.
503: Сервер перегружен → добавить балансировку нагрузки.
Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что такое git stash?
git stash — это временное сохранение текущих изменений в "карман", чтобы вернуться к чистому состоянию рабочего каталога. Это удобно, если нужно переключиться на другую ветку, не делая коммит. Позже можно восстановить изменения или удалить их.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
git stash — это временное сохранение текущих изменений в "карман", чтобы вернуться к чистому состоянию рабочего каталога. Это удобно, если нужно переключиться на другую ветку, не делая коммит. Позже можно восстановить изменения или удалить их.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥2