120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
"""
|
|
REST Framework configuration settings
|
|
"""
|
|
|
|
from datetime import timedelta
|
|
|
|
REST_FRAMEWORK = {
|
|
# Use Django's standard `django.contrib.auth` permissions,
|
|
# or allow read-only access for unauthenticated users.
|
|
'DEFAULT_PERMISSION_CLASSES': [
|
|
'rest_framework.permissions.IsAuthenticated',
|
|
],
|
|
'DEFAULT_AUTHENTICATION_CLASSES': [
|
|
'rest_framework_simplejwt.authentication.JWTAuthentication',
|
|
'rest_framework.authentication.SessionAuthentication',
|
|
'rest_framework.authentication.BasicAuthentication',
|
|
],
|
|
# Pagination settings
|
|
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
|
|
'PAGE_SIZE': 10,
|
|
# Filtering
|
|
'DEFAULT_FILTER_BACKENDS': [
|
|
'django_filters.rest_framework.DjangoFilterBackend',
|
|
'rest_framework.filters.SearchFilter',
|
|
'rest_framework.filters.OrderingFilter',
|
|
],
|
|
# Throttling
|
|
'DEFAULT_THROTTLE_CLASSES': [
|
|
'rest_framework.throttling.AnonRateThrottle',
|
|
'rest_framework.throttling.UserRateThrottle'
|
|
],
|
|
'DEFAULT_THROTTLE_RATES': {
|
|
'anon': '100/day',
|
|
'user': '1000/day'
|
|
},
|
|
# Versioning
|
|
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
|
|
'DEFAULT_VERSION': 'v1',
|
|
'ALLOWED_VERSIONS': ['v1'],
|
|
'VERSION_PARAM': 'version',
|
|
# Schema
|
|
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
|
|
# Renderer/Parser settings
|
|
'DEFAULT_RENDERER_CLASSES': [
|
|
'rest_framework.renderers.JSONRenderer',
|
|
'rest_framework.renderers.BrowsableAPIRenderer',
|
|
],
|
|
'DEFAULT_PARSER_CLASSES': [
|
|
'rest_framework.parsers.JSONParser',
|
|
'rest_framework.parsers.FormParser',
|
|
'rest_framework.parsers.MultiPartParser'
|
|
],
|
|
# Exception handling
|
|
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
|
|
# Content negotiation
|
|
'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation',
|
|
# Metadata
|
|
'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata',
|
|
# Caching
|
|
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 15, # 15 minutes
|
|
# Test settings
|
|
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
|
|
'TEST_REQUEST_RENDERER_CLASSES': [
|
|
'rest_framework.renderers.JSONRenderer',
|
|
],
|
|
}
|
|
|
|
# JWT Settings
|
|
SIMPLE_JWT = {
|
|
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
|
|
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
|
|
'ROTATE_REFRESH_TOKENS': False,
|
|
'BLACKLIST_AFTER_ROTATION': True,
|
|
'UPDATE_LAST_LOGIN': False,
|
|
|
|
'ALGORITHM': 'HS256',
|
|
'SIGNING_KEY': None, # Will use Django's SECRET_KEY
|
|
'VERIFYING_KEY': None,
|
|
'AUDIENCE': None,
|
|
'ISSUER': None,
|
|
|
|
'AUTH_HEADER_TYPES': ('Bearer',),
|
|
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
|
|
'USER_ID_FIELD': 'id',
|
|
'USER_ID_CLAIM': 'user_id',
|
|
|
|
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
|
|
'TOKEN_TYPE_CLAIM': 'token_type',
|
|
|
|
'JTI_CLAIM': 'jti',
|
|
|
|
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
|
|
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
|
|
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
|
|
}
|
|
|
|
# Spectacular API settings
|
|
SPECTACULAR_SETTINGS = {
|
|
'TITLE': 'AlumniVerse API',
|
|
'DESCRIPTION': 'API documentation for AlumniVerse platform',
|
|
'VERSION': '1.0.0',
|
|
'SERVE_INCLUDE_SCHEMA': False,
|
|
'COMPONENT_SPLIT_REQUEST': True,
|
|
'SWAGGER_UI_SETTINGS': {
|
|
'deepLinking': True,
|
|
'persistAuthorization': True,
|
|
'displayOperationId': True,
|
|
},
|
|
'SWAGGER_UI_DIST': 'SIDECAR',
|
|
'SWAGGER_UI_FAVICON_HREF': 'SIDECAR',
|
|
'REDOC_DIST': 'SIDECAR',
|
|
'PREPROCESSING_HOOKS': [],
|
|
'SERVE_PERMISSIONS': ['rest_framework.permissions.IsAuthenticated'],
|
|
'SERVE_AUTHENTICATION': ['rest_framework.authentication.SessionAuthentication'],
|
|
'SWAGGER_UI_SETTINGS': {
|
|
'deepLinking': True,
|
|
'persistAuthorization': True,
|
|
'displayOperationId': True,
|
|
},
|
|
} |