Created
May 19, 2026 08:10
-
-
Save sunmeat/34728615998be5ba6ece8dbf560360b4 to your computer and use it in GitHub Desktop.
throttling example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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