GitHub 블로그
유튜브 영상     깃허브 프로필

4 분 소요

[공지사항] 지킬블로그 안내드립니다.

지킬 블로그에 대하여 알아보겠습니다.

버튼입니다

이 코드는 Django 프로젝트의 settings.py 파일을 설정하는 내용입니다. 이 파일은 Django 프로젝트의 전반적인 설정을 관리합니다. 아래에서 각 설정 항목의 역할을 자세히 설명하겠습니다.

1. 기본 설정

from pathlib import Path
from decouple import config
import pymysql
import os
import ssl

ssl._create_default_https_context = ssl._create_unverified_context

BASE_DIR = Path(__file__).resolve().parent.parent.parent
  • from pathlib import Path: 파일 경로를 조작하기 위한 Path 클래스를 가져옵니다.
  • from decouple import config: 환경 변수를 관리하기 위해 decouple 라이브러리의 config 함수를 가져옵니다.
  • import pymysql: MySQL 데이터베이스에 연결하기 위해 pymysql 라이브러리를 가져옵니다.
  • import os: 환경 변수 및 경로 조작을 위해 os 모듈을 가져옵니다.
  • import ssl: SSL/TLS 인증서 처리를 위한 ssl 모듈을 가져옵니다.
  • ssl._create_default_https_context = ssl._create_unverified_context: SSL 인증서 검증을 무시하도록 설정합니다. (보안에 주의 필요)
  • BASE_DIR = Path(__file__).resolve().parent.parent.parent: 프로젝트의 기본 디렉토리 경로를 설정합니다.

2. Django 기본 설정


SECRET_KEY = config('SECRET_KEY', default='django-insecure-a3_d(puh2n+89zyudoz%)^cz14waicrb1$3$r+)1&y$p8-%0!w')

DEBUG = config('DEBUG', default=True, cast=bool)

ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='', cast=lambda v: [s.strip() for s in v.split(',')])
  • SECRET_KEY: Django의 보안 키로, 암호화 및 세션 관리를 위한 비밀 키입니다. 환경 변수로부터 가져오며, 기본값을 설정할 수 있습니다.
  • DEBUG: 디버그 모드를 설정합니다. 개발 중에는 True로 설정하고, 배포 시 False로 변경합니다.
  • ALLOWED_HOSTS: 허용된 호스트의 목록입니다. 웹 애플리케이션이 요청을 받을 수 있는 호스트를 설정합니다.

3. 앱 및 미들웨어 설정


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
    'rest_framework',
]

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',
]
  • INSTALLED_APPS: Django 프로젝트에서 사용할 앱을 등록합니다. 기본 제공 앱 외에 myapprest_framework를 추가했습니다.
  • MIDDLEWARE: 요청과 응답 처리 과정에서 사용할 미들웨어를 설정합니다. CSRF, 세션, 인증 등 다양한 미들웨어가 포함되어 있습니다.

4. 템플릿 설정


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(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',
            ],
        },
    },
]
  • TEMPLATES: Django 템플릿 엔진 설정입니다. 템플릿 디렉토리와 템플릿 컨텍스트 프로세서를 지정합니다.

5. 데이터베이스 설정


import os

AWS_ACCESS_KEY_ID = os.getenv('AWS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_BUCKET_NAME')

pymysql.install_as_MySQLdb()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': config('DB_NAME', default='DB_NAME'),
        'USER': config('DB_USER', default='DB_USER'),
        'PASSWORD': config('DB_PASSWORD', default='DB_PASSWORD'),
        'HOST': config('DB_HOST', default='DB_HOST'),
        'PORT': config('DB_PORT', default='DB_PORT'),
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'"
        }
    }
}

try:
    connection = pymysql.connect(
        host=config('DB_HOST', default='DB_HOST'),
        user=config('DB_USER', default='DB_USER'),
        password=config('DB_PASSWORD', default='DB_PASSWORD'),
        database=config('DB_NAME', default='DB_NAME'),
        port=int(config('DB_PORT', default='DB_PORT'))
    )
    print("Connection successful")
except pymysql.MySQLError as e:
    print(f"Error connecting to the database: {e}")
finally:
    if 'connection' in locals() and connection.open:
        connection.close()
  • AWS 설정: AWS 관련 환경 변수 설정입니다.
  • pymysql.install_as_MySQLdb(): pymysql을 MySQLdb로 사용하도록 설정합니다.
  • DATABASES: MySQL 데이터베이스 설정입니다. 데이터베이스의 이름, 사용자, 비밀번호, 호스트, 포트 등을 설정합니다.
  • try...except: 데이터베이스 연결을 테스트합니다. 연결 성공 여부를 출력합니다.

6. CSRF 및 인증 관련 설정


CSRF_TRUSTED_ORIGINS = config('CSRF_TRUSTED_ORIGINS', default='http://localhost:8000', cast=lambda v: [s.strip() for s in v.split(',')])

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',
    },
]
  • CSRF_TRUSTED_ORIGINS: CSRF 보호를 위한 신뢰할 수 있는 출처를 설정합니다.
  • AUTH_PASSWORD_VALIDATORS: 비밀번호 검증 규칙을 설정합니다. 다양한 비밀번호 검증기를 포함합니다.

7. 이메일 설정


EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = config('EMAIL_HOST_USER', default='')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default='')
  • EMAIL_BACKEND: 이메일 백엔드를 설정합니다. SMTP 서버를 사용합니다.
  • EMAIL_HOST, EMAIL_PORT, EMAIL_USE_TLS: SMTP 서버 설정입니다.
  • EMAIL_HOST_USER, EMAIL_HOST_PASSWORD: 이메일 서버 로그인 정보입니다.

8. Django REST Framework 설정


REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_FILTER_BACKENDS': [
        'rest_framework.filters.SearchFilter',
        'rest_framework.filters.OrderingFilter',
    ],
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day',
    },
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}
  • DEFAULT_RENDERER_CLASSES: API 응답의 기본 렌더러 클래스를 설정합니다.
  • DEFAULT_AUTHENTICATION_CLASSES: API 요청의 기본 인증 클래스를 설정합니다.
  • DEFAULT_FILTER_BACKENDS: API 데이터 필터링에 사용할 기본 필터 백엔드를 설정합니다.
  • DEFAULT_THROTTLE_CLASSES: 요청 속도 제한을 위한 기본 클래스입니다.
  • DEFAULT_THROTTLE_RATES: 요청 속도 제한의 기본 속도를 설정합니다.
  • DEFAULT_PAGINATION_CLASS: API 응답의 기본 페이지네이션 클래스를 설정합니다.
  • PAGE_SIZE: 페이지당 항목 수를 설정합니다.

9. 미디어 및 정적 파일 설정

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_TZ = False

STATIC_URL = 'static/'

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
  • MEDIA_URL, MEDIA_ROOT: 업로드된 미디어 파일의 URL과 파일 시스템 경로를 설정합니다.
  • LANGUAGE_CODE: 프로젝트의 기본 언어를 설정합니다.
  • TIME_ZONE: 프로젝트의 기본 시간대를 설정합니다.
  • USE_I18N: 국제화 사용 여부를 설정합니다.
  • USE_TZ: 시간대 사용 여부를 설정합니다.
  • STATIC_URL: 정적 파일의 URL 경로를 설정합니다.
  • DEFAULT_AUTO_FIELD: Django 모델의 기본 자동 필드 유형을 설정합니다.

이 설정 파일은 Django 프로젝트의 핵심적인 설정을 다루며, 데이터베이스 연결, 미들웨어 설정, 이메일 설정 등 프로젝트의 전반적인 동작을 제어합니다. 각 설정 항목을 이해하고 올바르게 구성하는 것이 중요합니다.

Django의 설정 파일에서 ALLOWED_HOSTS

이 코드는 Django의 설정 파일에서 ALLOWED_HOSTS 설정을 재정의하고 있습니다. from .base import * 문은 base.py라는 다른 설정 파일에서 모든 설정을 가져와서 현재 설정 파일에 포함시키는 것입니다. 그 후, ALLOWED_HOSTS 값을 재정의하여 이 호스트들만 허용되도록 하고 있습니다.

자세히 설명하자면:

1. from .base import *

  • 이 구문은 현재 설정 파일(예: settings.py)에 base.py에서 정의된 모든 설정을 가져옵니다. 이를 통해 공통 설정을 여러 설정 파일에서 재사용할 수 있습니다.

2. ALLOWED_HOSTS = ['3.36.151.186', 'localhost', '127.0.0.1']

  • ALLOWED_HOSTS: 이 설정은 Django 애플리케이션이 요청을 받을 수 있는 호스트의 목록을 정의합니다. ALLOWED_HOSTS에 포함되지 않은 호스트에서 들어오는 요청은 Django에 의해 차단됩니다.
  • 목록의 내용:
    • '3.36.151.186': 이 IP 주소는 Django 애플리케이션이 허용하는 호스트 중 하나입니다. 보통 서버의 퍼블릭 IP 주소입니다.
    • 'localhost': 로컬 개발 환경에서의 호스트 이름입니다.
    • '127.0.0.1': 로컬호스트의 IP 주소입니다. 'localhost'와 동일하게 로컬 환경에서 접근할 수 있습니다.

이 설정은 다음과 같은 목적을 가집니다:

  1. 보안: ALLOWED_HOSTS 설정을 통해 애플리케이션이 의도하지 않은 도메인에서 요청을 받지 않도록 보안성을 강화합니다. 이 설정을 적절히 구성하지 않으면 보안 취약점이 발생할 수 있습니다.
  2. 호스트 제한: 실제 배포 시, 서버의 IP 주소나 도메인 이름을 ALLOWED_HOSTS에 추가하여, 오직 특정 도메인에서만 요청을 받아들일 수 있도록 제한합니다.

적용 예시

예를 들어, ALLOWED_HOSTS가 다음과 같이 설정되어 있다면:


ALLOWED_HOSTS = ['example.com', 'www.example.com', 'subdomain.example.com']

이 설정은 다음을 의미합니다:

  • example.comwww.example.comsubdomain.example.com에서 오는 요청만 허용됩니다.
  • 다른 도메인이나 IP 주소에서의 요청은 Django 서버가 차단합니다.

이 설정은 보안상의 이유로 반드시 설정해주어야 하며, 특히 실제 운영 환경에서는 DEBUG = False로 설정하고, ALLOWED_HOSTS를 적절히 구성하여 외부의 악의적인 접근을 방지하는 것이 중요합니다.

댓글남기기