728x90

이번에 우연찮게 동아리에서 오랜만에 django로 서버개발을 맡게 되며 초기 세팅을 하고 있는데 오랜만에 하게되다보니 길을 굉장히 헤멧다ㅎ... 그래서 리마인드겸 아래의 작업들에 대해 포스팅할 생각이다.

1. 환경 분리

2. django rds s3 연동

3. 소셜로그인(kakao) 연동, jwt 토큰 발급 및 middleware, authentication 세팅(라이브러리 사용x)

- django settings 파일 분리

이 settings 파일을 왜분리해야 하나?라는 생각이 들수 있다.

Django의 경우, settings.py에서 기본적인 설정들을 명시해두기 때문에 테스트와 실 운영 설정은 다르게 가져가야한다. 기본적으로 분리해야하는 것같은경우 아래와 같다. 

1. DEBUG

2. SECRET_KEY

3. DATABASE

4. STATIC FILE, MEDIA FILE --> 이것들은 선택사항일수도 있지만 필자의 경우 운영서버의경우, S3연동을 주로합니다!

 

settings파일은 크게 공통사항은 settings/__init__.py에 명시하고, deploy와 develop으로 나눠진행할예정입니다.

django-admin startproject config .

위의 명령어를 통해 config 폴더가 생성되면 내부에 settings, wsgi 폴더를 생성해줍니다.

기본적으로 settings 내용은 아래와 같습니다.

__init__.py (공통적으로 사용할 설정)

"""
Django settings for config project.

Generated by 'django-admin startproject' using Django 4.2.1.

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/
"""

from pathlib import Path
import environ

import os


# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent.parent

# django-environ 라이브러리를 통해 환경변수 세팅을 진행했는데 다른방식을 사용해도 무방합니다!
env = environ.Env(DEBUG=(bool, True))
environ.Env.read_env(
    env_file=os.path.join(BASE_DIR, '.env')
)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/

DJANGO_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

PROJECT_APPS = [
]

THIRD_PARTY_APPS = [
    'rest_framework',
    'drf_yasg',
]

INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS

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 = 'config.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',
            ],
        },
    },
]


# 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 = 'ko-kr'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_TZ = True

# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

deploy.py(실 운영 서버에서 사용할 settings) - 추후 S3와 RDS를 사용한다는 가정하에 세팅한겁니다.

from config.settings import *

DEBUG = False

SECRET_KEY = env('SECRET_KEY')

ALLOWED_HOSTS = ['*']

INSTALLED_APPS += [
    'storages',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env('DATABASE_NAME'),
        'HOST': env('DATABASE_HOST'),
        'USER': env('DATABASE_USER'),
        'PASSWORD': env('DATABASE_PASSWORD'),
        'PORT': env('DATABASE_PORT'),
    }
}

WSGI_APPLICATION = 'config.wsgi.deploy.application'

AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')
AWS_REGION = 'ap-northeast-2'

AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME, AWS_REGION)
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

STATIC_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

develop.py(로컬환경에서 사용할 settings파일)

from config.settings import *

DEBUG = True

SECRET_KEY = 'django-insecure-sb!sadasdasdasdasdasd'

ALLOWED_HOSTS = []

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

WSGI_APPLICATION = 'config.wsgi.develop.application'

STATIC_URL = 'static/'

wsgi/deploy.py

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.deploy')

application = get_wsgi_application()

wsgi/develop.py

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.develop')

application = get_wsgi_application()

이후 develop와 deploy환경 파일을 사용환경에 따라 아래와 같이 분리하여 실행시켜주면됩니다.

# 테스트환경
python3 manage.py runserver --settings=config.settings.develop
# 운영환경
python3 manage.py runserver --settings=config.settings.deploy

그리고 환경변수 import시 가끔 실수를 하는 부분이 특정 settings파일을 명시해서 가져오는경우가 있는데 이런실수를 저지르면 안됩니다!

# 이경우, 환경 분리를했더라도 deploy가아닌 develop의 값을 가져옵니다.
from config.settings.develop import SECRET_KEY
value = SECRET_KEY

# 이경우, 실행환환경 세팅을 불러오니 이방법으로 불러오길 추천드립니다.
from django.conf import settings
value = settings.SECRET_KEY

 

728x90

+ Recent posts