""" Django settings for mysite project. Generated by 'django-admin startproject' using Django 4.2.4. For more information on this file, see https://docs.djangoproject.com/en/4.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.2/ref/settings/ """ import logging import os from pathlib import Path from decouple import config, Csv # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ #! SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = config('SECRET_KEY', default='k2pd1p)zwe0qy0k25=sli+7+n^vd-0h*&6vga6oldq=781+7qw') #! SECURITY WARNING: don't run with debug turned on in production! DEBUG = config('DEBUG', default=False, cast=bool) ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='*', cast=Csv()) # Application definition INSTALLED_APPS = [ "polls.apps.PollsConfig", 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE = [ '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 = 'mysite.urls' TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [BASE_DIR / "templates"], "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 = 'mysite.wsgi.application' # * Loggin template from https://www.youtube.com/watch?v=m_EkU56KdJg, Modify a bit. LOGS_DIR = os.path.join(BASE_DIR, 'logs') if not os.path.exists(LOGS_DIR): os.makedirs(LOGS_DIR) # ! LOGGERS -> entry point into the logging system. LOGGERS = ( { "django": { "handlers": ["console_handler", "info_handler"], "level": "INFO", }, "django.request": { "handlers": ["error_handler"], "level": "INFO", "propagate": True, }, "django.template": { "handlers": ["error_handler"], "level": "DEBUG", "propagate": True, }, "django.server": { "handlers": ["error_handler"], "level": "INFO", "propagate": True, }, }, ) # ! FORMATTER -> a log record needs to be rendered as text. Formatters describe the exact format of that text. FORMATTERS = ( { "verbose": { "format": "{levelname} {asctime:s} {name} {threadName} {thread:d} {module} {filename} {lineno:d} {name} {funcName} {process:d} {message}", "style": "{", }, "simple": { "format": "{levelname} {asctime:s} {name} {module} {filename} {lineno:d} {funcName} {message}", "style": "{", }, }, ) # ! HANDLERS -> The handler is the engine that determines what happens to each message in a logger HANDLERS = { # StreamHandler -> sends log messages to the console "console_handler": { "class": "logging.StreamHandler", "formatter": "simple", "level": "DEBUG" }, # RotatingFileHandlers -> write log messages to files "info_handler": { "class": "logging.handlers.RotatingFileHandler", "filename": f"{BASE_DIR}/logs/blogthedata_info.log", "mode": "a", "encoding": "utf-8", "formatter": "verbose", "level": "INFO", "backupCount": 5, "maxBytes": 1024 * 1024 * 5, # 5 MB }, "error_handler": { "class": "logging.handlers.RotatingFileHandler", "filename": f"{BASE_DIR}/logs/blogthedata_error.log", "mode": "a", "formatter": "verbose", "level": "WARNING", "backupCount": 5, "maxBytes": 1024 * 1024 * 5, # 5 MB }, } # ! LOGGING LOGGING = { "version": 1, "disable_existing_loggers": False, # If set to True, it disables all loggers from previous configurations "formatters": FORMATTERS[0], "handlers": HANDLERS, "loggers": LOGGERS[0], } # Database # https://docs.djangoproject.com/en/4.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # Password validation # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators 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', }, ] # Internationalization # https://docs.djangoproject.com/en/4.2/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = config('TIME_ZONE', default='UTC', cast=str) USE_I18N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.2/howto/static-files/ STATIC_URL = '/static/' # ! On production -> Configure your web server to serve the files in STATIC_ROOT under the URL STATIC_URL # * https://docs.djangoproject.com/en/4.2/howto/static-files/deployment/ STATIC_ROOT = BASE_DIR / "assets" STATICFILES_DIRS = [BASE_DIR] # Default primary key field type # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' LOGIN_REDIRECT_URL = "home_redirect" LOGOUT_REDIRECT_URL = "home_redirect" EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend" EMAIL_FILE_PATH = BASE_DIR / "sent_emails"