· 4 years ago · Jul 24, 2021, 10:18 AM
1#local
2
3import os
4from .common import Common
5BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
6
7
8class Local(Common):
9 DEBUG = True
10
11 # Testing
12 INSTALLED_APPS = Common.INSTALLED_APPS
13 INSTALLED_APPS += ('django_nose',)
14 TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
15 NOSE_ARGS = [
16 BASE_DIR,
17 '-s',
18 '--nologcapture',
19 '--with-coverage',
20 '--with-progressive',
21 '--cover-package=hakeemdictionarybackend'
22 ]
23
24 # Mail
25 EMAIL_HOST = 'localhost'
26 EMAIL_PORT = 1025
27 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
28
29
30#common
31
32
33import os
34from os.path import join
35from distutils.util import strtobool
36import dj_database_url
37import datetime
38from configurations import Configuration
39BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
40
41
42class Common(Configuration):
43
44 INSTALLED_APPS = (
45 'django.contrib.admin',
46 'django.contrib.auth',
47 'django.contrib.contenttypes',
48 'django.contrib.sessions',
49 'django.contrib.messages',
50 'django.contrib.staticfiles',
51
52
53 # Third party apps
54 'rest_framework', # utilities for rest apis
55 'rest_framework.authtoken', # token authentication
56 'django_filters', # for filtering rest endpoints
57 'django_q',
58 'corsheaders',
59
60 # Your apps
61 'hakeemdictionarybackend.users',
62 'hakeemdictionarybackend.dictionary',
63
64
65 )
66
67 # https://docs.djangoproject.com/en/2.0/topics/http/middleware/
68 MIDDLEWARE = (
69 'django.middleware.security.SecurityMiddleware',
70 'django.contrib.sessions.middleware.SessionMiddleware',
71 'django.middleware.common.CommonMiddleware',
72 'django.middleware.csrf.CsrfViewMiddleware',
73 'django.contrib.auth.middleware.AuthenticationMiddleware',
74 'django.contrib.messages.middleware.MessageMiddleware',
75 'django.middleware.clickjacking.XFrameOptionsMiddleware',
76 'corsheaders.middleware.CorsMiddleware',
77 )
78
79 ALLOWED_HOSTS = ["*"]
80 ROOT_URLCONF = 'hakeemdictionarybackend.urls'
81 SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')
82 WSGI_APPLICATION = 'hakeemdictionarybackend.wsgi.application'
83
84 CORS_ORIGIN_ALLOW_ALL = True
85 # CORS_ALLOW_CREDENTIALS = False
86 # CORS_ORIGIN_WHITELIST = (
87 # # TODO - set this properly for production
88 # 'https://localhost:8000',
89 # 'http://localhost:8000',
90 # )
91
92 # Email
93 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
94
95 ADMINS = (
96 ('Author', 'a.tlimat@gmail.com'),
97 )
98
99 # Postgres
100 DATABASES = {
101 'default': dj_database_url.config(
102 default='postgres://postgres:@postgres:5432/postgres',
103 conn_max_age=int(os.getenv('POSTGRES_CONN_MAX_AGE', 600))
104 )
105 }
106
107 # General
108 APPEND_SLASH = False
109 TIME_ZONE = 'America/New_York'
110 LANGUAGE_CODE = 'en-us'
111 # If you set this to False, Django will make some optimizations so as not
112 # to load the internationalization machinery.
113 USE_I18N = False
114 USE_L10N = True
115 USE_TZ = True
116 LOGIN_REDIRECT_URL = '/'
117
118 # Static files (CSS, JavaScript, Images)
119 # https://docs.djangoproject.com/en/2.0/howto/static-files/
120 STATIC_ROOT = os.path.normpath(join(os.path.dirname(BASE_DIR), 'static'))
121 STATICFILES_DIRS = []
122 STATIC_URL = '/static/'
123 STATICFILES_FINDERS = (
124 'django.contrib.staticfiles.finders.FileSystemFinder',
125 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
126 )
127
128 # Media files
129 MEDIA_ROOT = join(os.path.dirname(BASE_DIR), 'media')
130 MEDIA_URL = '/media/'
131
132 TEMPLATES = [
133 {
134 'BACKEND': 'django.template.backends.django.DjangoTemplates',
135 'DIRS': [BASE_DIR + '/templates'],
136 'APP_DIRS': True,
137 'OPTIONS': {
138 'context_processors': [
139 'django.template.context_processors.debug',
140 'django.template.context_processors.request',
141 'django.contrib.auth.context_processors.auth',
142 'django.contrib.messages.context_processors.messages',
143 ],
144 },
145 },
146 ]
147
148 # Set DEBUG to False as a default for safety
149 # https://docs.djangoproject.com/en/dev/ref/settings/#debug
150 DEBUG = strtobool(os.getenv('DJANGO_DEBUG', 'no'))
151
152 # Password Validation
153 # https://docs.djangoproject.com/en/2.0/topics/auth/passwords/#module-django.contrib.auth.password_validation
154 AUTH_PASSWORD_VALIDATORS = [
155 {
156 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
157 },
158 {
159 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
160 },
161 {
162 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
163 },
164 {
165 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
166 },
167 ]
168
169 Q_CLUSTER = {
170 'redis': {
171 'host': 'redis',
172 'port': 6379,
173 'db': 0,
174 'password': None,
175 'socket_timeout': None,
176 'charset': 'utf-8',
177 'errors': 'strict',
178 'unix_socket_path': None
179 }
180 }
181
182 JWT_AUTH = {
183 'JWT_ALLOW_REFRESH': True,
184 'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=1),
185 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
186 }
187
188 # Logging
189 LOGGING = {
190 'version': 1,
191 'disable_existing_loggers': False,
192 'formatters': {
193 'django.server': {
194 '()': 'django.utils.log.ServerFormatter',
195 'format': '[%(server_time)s] %(message)s',
196 },
197 'verbose': {
198 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
199 },
200 'simple': {
201 'format': '%(levelname)s %(message)s'
202 },
203 },
204 'filters': {
205 'require_debug_true': {
206 '()': 'django.utils.log.RequireDebugTrue',
207 },
208 },
209 'handlers': {
210 'django.server': {
211 'level': 'INFO',
212 'class': 'logging.StreamHandler',
213 'formatter': 'django.server',
214 },
215 'console': {
216 'level': 'DEBUG',
217 'class': 'logging.StreamHandler',
218 'formatter': 'simple'
219 },
220 'mail_admins': {
221 'level': 'ERROR',
222 'class': 'django.utils.log.AdminEmailHandler'
223 }
224 },
225 'loggers': {
226 'django': {
227 'handlers': ['console'],
228 'propagate': True,
229 },
230 'django.server': {
231 'handlers': ['django.server'],
232 'level': 'INFO',
233 'propagate': False,
234 },
235 'django.request': {
236 'handlers': ['mail_admins', 'console'],
237 'level': 'ERROR',
238 'propagate': False,
239 },
240 'django.db.backends': {
241 'handlers': ['console'],
242 'level': 'INFO'
243 },
244 }
245 }
246
247 # Custom user app
248 AUTH_USER_MODEL = 'users.User'
249
250 # Django Rest Framework
251 REST_FRAMEWORK = {
252 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
253 'PAGE_SIZE': int(os.getenv('DJANGO_PAGINATION_LIMIT', 10)),
254 'DATETIME_FORMAT': '%Y-%m-%dT%H:%M:%S%z',
255 'DEFAULT_RENDERER_CLASSES': (
256 'rest_framework.renderers.JSONRenderer',
257 'rest_framework.renderers.BrowsableAPIRenderer',
258 ),
259 'DEFAULT_PERMISSION_CLASSES': [
260 'rest_framework.permissions.IsAuthenticated',
261 ],
262 'DEFAULT_AUTHENTICATION_CLASSES': (
263 'rest_framework.authentication.SessionAuthentication',
264 'rest_framework.authentication.TokenAuthentication',
265 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
266 ),
267 'DEFAULT_THROTTLE_CLASSES': [
268 'rest_framework.throttling.AnonRateThrottle'
269 ],
270 'DEFAULT_THROTTLE_RATES': {'anon': '6/minute'}
271 }
272
273
274#production
275
276import os
277from .common import Common
278import dj_database_url
279
280class Production(Common):
281 INSTALLED_APPS = Common.INSTALLED_APPS
282 SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')
283 # Site
284 # https://docs.djangoproject.com/en/2.0/ref/settings/#allowed-hosts
285 ALLOWED_HOSTS = ["*"]
286 INSTALLED_APPS += ("gunicorn", )
287
288 # Static files (CSS, JavaScript, Images)
289 # https://docs.djangoproject.com/en/2.0/howto/static-files/
290 # http://django-storages.readthedocs.org/en/latest/index.html
291 INSTALLED_APPS += ('storages',)
292 DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
293 STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'
294 AWS_ACCESS_KEY_ID = os.getenv('DJANGO_AWS_ACCESS_KEY_ID')
295 AWS_SECRET_ACCESS_KEY = os.getenv('DJANGO_AWS_SECRET_ACCESS_KEY')
296 AWS_STORAGE_BUCKET_NAME = os.getenv('DJANGO_AWS_STORAGE_BUCKET_NAME')
297 AWS_DEFAULT_ACL = 'public-read'
298 AWS_AUTO_CREATE_BUCKET = True
299 AWS_QUERYSTRING_AUTH = False
300 POSTGRES_HOST_NAME = os.getenv('POSTGRES_HOST_NAME')
301 POSTGRES_PORT = os.getenv('POSTGRES_PORT', 5432)
302 POSTGRES_DB_NAME = os.getenv('POSTGRES_DB_NAME')
303 POSTGRES_DB_USER = os.getenv('POSTGRES_DB_USER')
304 POSTGRES_USER_PASS = os.getenv('POSTGRES_USER_PASS')
305
306 MEDIA_URL = f'https://s3.amazonaws.com/{AWS_STORAGE_BUCKET_NAME}/'
307
308 # https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#cache-control
309 # Response can be cached by browser and any intermediary caches (i.e. it is "public") for up to 1 day
310 # 86400 = (60 seconds x 60 minutes x 24 hours)
311 AWS_HEADERS = {
312 'Cache-Control': 'max-age=86400, s-maxage=86400, must-revalidate',
313 }
314
315 # Postgres
316 DATABASES = {
317 'default': dj_database_url.config(
318 default=f'postgres://{POSTGRES_DB_USER}:{POSTGRES_USER_PASS}@{POSTGRES_HOST_NAME}:{POSTGRES_PORT}/{POSTGRES_DB_NAME}',
319 conn_max_age=int(os.getenv('POSTGRES_CONN_MAX_AGE', 600))
320 )
321 }
322