Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created May 19, 2026 08:10
Show Gist options
  • Select an option

  • Save sunmeat/34728615998be5ba6ece8dbf560360b4 to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/34728615998be5ba6ece8dbf560360b4 to your computer and use it in GitHub Desktop.
throttling example
import os
import posixpath
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = 'b2ea905d-f402-441b-b8e9-fbe0b3899a92'
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'corsheaders',
'app',
'api',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # !!!
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'Rest.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'Rest.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
#####################################################################################################
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [ # це вбудовані класи для обмеження кількості запитів, які можуть бути зроблені анонімними користувачами та автентифікованими користувачами
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
],
'DEFAULT_THROTTLE_RATES': { # це налаштування, яке визначає, скільки запитів можуть бути зроблені анонімними користувачами та автентифікованими користувачами за певний період часу
'anon': '10/day', # окрім day можна використовувати second, minute, hour, month
'user': '10000/day',
# обмеження діятиме лише для прямих запитів до API, а не для запитів, які йдуть через веб-інтерфейс, оскільки веб-інтерфейс використовує сесії для автентифікації, а не токени або інші методи, які можуть бути використані для API
# для обмеження на рівні веб-інтерфейсу можна написати кастомний middleware, який буде відслідковувати кількість запитів від кожного користувача і блокувати їх після досягнення певного ліміту
# але в реальних проєктах замість самописних рішень для обмеження кількості запитів часто використовують спеціалізовані інструменти, такі як Redis або Cloudflare, які можуть ефективно керувати великими обсягами трафіку і забезпечувати надійне обмеження кількості запитів без перевантаження сервера
},
'DEFAULT_AUTHENTICATION_CLASSES': [ # без цього не працюватиме обмеження кількості запитів для автентифікованих користувачів, бо Django не знатиме, хто автентифікований, а хто ні
'rest_framework.authentication.SessionAuthentication', # це стандартна аутентифікація, яка використовує сесії Django, ідеально підходить для веб-застосунків, де користувачі входять через браузер
'rest_framework.authentication.BasicAuthentication', # це базова аутентифікація, яка використовує HTTP заголовки для передачі імені користувача та пароля, ідеально підходить для API, які використовуються сторонніми клієнтами або для тестування
],
}
CACHES = { # так джанго розуміє, де зберігати дані для обмеження кількості запитів
"default": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache", # це вбудований кеш, який зберігає дані в пам'яті процесу, ідеально підходить для розробки та тестування
# але в реальному застосунку краще використовувати більш потужний кеш, наприклад Redis або Memcached
"LOCATION": "unique-snowflake", # це просто унікальна назва для цього кешу, можна будь-яку
}
}
#####################################################################################################
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LANGUAGE_CODE = 'uk'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
CORS_ALLOW_ALL_ORIGINS = True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment