Backend/Django

Django 실전 운용 - 2. Django project 생성

뒷골목프로그래머 2022. 12. 25. 20:04
반응형

본 시리즈는 Python과 Django Backend 개발 경험이 있으신 분들을 대상으로 작성되었습니다.

 

안녕하세요.

글쓰는 개발자 입니다.

 

 다수의 다양한 Project를 수주 받는 SI회사에서 Project 초기 세팅 비용 최소화 및 회사 차원의 기술 축적을 위해 수행한 Project Base 구축 과정을 시리즈로 소개합니다.

1. Project Base 구축 필요성 (요구 기능과 필요한 기술)
2. Django project 생성
3. Django, mariaDB, Redis with Docker Compose (예정)
4. settings.py 개발 환경, 운영 환경 분리 (예정)
5. Logging (예정)
6. Error Log 관리자 email 전송 (예정)
7. Django, Celery, Redis 활용 email 전송 비동기 처리 (예정)
8. Django, Celery, Celery Beat 활용 scheduling (예정)

 

 Project Base 구축 작업의 시작을 위해 Django Local 개발을 위해 꼭 필요한 작업 중 매번 귀찮게 느껴지는 것을 먼저 나열해 보았습니다. 이후 배포 환경을 전혀 고려하지 않고 Local 개발 환경만 생각하더라도 아래의 6가지가 만족되어야 개발을 '시작' 할 수 있다고 생각했습니다. 본 튜토리얼을 통해, 배포 이전에 Local 개발 환경을 어떻게 구축하는 지 이해하는 데 도움이 되셨으면 좋겠습니다.

1. 가상환경 세팅
2. Django 관련 기본 Package 설치
3. Django Project 생성
4. 보안 정보 분리, settings.py 변경
5. Django App 별 url 분리
6. Swagger 적용

 

1. 가상 환경 세팅

python -m venv .venv
source .venv/bin/activate

 

2. Django 관련 기본 Package 설치

pip install --upgrade pip
pip install django
pip install djangorestframework

 

3. Django Project 생성

django-admin startproject config .
django-admin startapp api

 

1) django-admin startproject {project 명칭} .

     저는 project 명칭을 config 로 정했습니다. 그 이유는 django project를 최초 생성했을 때 Project Structure는 아래 그림과 같습니다. 그런데 파일 구성을 보면 모두 setting과 관련된 내용들 입니다. 그리하여, 저는 처음부터 config 라는 이름으로 django project를 생성하여 하위 파일의 성격에 맞는 명명을 적용했습니다.

django config file

 

 

2) django-admin startapp {app 명칭}

     Django 는 단일 Project 내부에 기능의 성격에 따라 여러 개의 app 을 구분 할 수 있습니다. app을 추가하면 view, model, tests 등 기능을 담당 할 기본 파일이 생성 됩니다.

django app 생성

 

3) Django 실행

    여기까지 적용되면 아래 명령어를 통해 Django Project를 시작 할 수 있습니다.

python manage.py runserver

python manage.py runserver

 

 

4. 보안 정보 분리, settings.py 변경

    Project를 진행하다 보면, DB 접속 정보 등 보안이 필요한 사항이 있습니다. 저는 django-environ 을 활용해 .env 파일로 보안이 필요한 정보를 분리합니다.

 

1) django-environ 설치 

pip install django-environ

 

2) .env file 생성

  config 디렉토리 하위에 .env 파일을 생성 합니다. 이후에 연동 할 MariaDB 관련 된 정보를 입력 합니다.

config/.env

SECRET_KEY=settings.py 에 default 로 생성되어있는 secret_key 를 옮긴 값

DB_ENGINE=django.db.backends.mysql
DB_NAME={생성 할 DB명, 따옴표 불필요}
DB_USER={생성 할 user명, 따옴표 불필요}
DB_PASSWORD={생성 할 user password, 따옴표 불필요}
DB_HOST=maraidb # docker-compose.yml 에서 지정한 container_name
DB_PORT=3306

 

3) settings.py 파일 django-environ 적용

  .env file에 작성한 보안 정보를 불러올 수 있도록 django-environ을 import 하고 불러옵니다.

# config/settings.py

...

import environ

env = environ.Env(
    DEBUG=(bool, False)
)
environ.Env.read_env()

...

 

읽어온 정보를 settings.py의 SECRET_KEY, DATABASES에 적용 합니다.

# config/settings.py

...

SECRET_KEY = env('SECRET_KEY')

...

DATABASES = {
    "default": {
        "ENGINE": env('DB_ENGINE'),
        "NAME": env('DB_NAME'),
        "USER": env('DB_USER'),
        "PASSWORD": env('DB_PASSWORD'),
        "HOST": env('DB_HOST'),
        "PORT": env('DB_PORT'),
    }
}

...


5. Django App 별 url 분리

   config 하위에 default로 생성되는 urls.py 가 있지만 Project의 규모가 커지고 app의 개수가 늘어나게 되면 유지보수가 힘들어집니다. 따라서 app 별로 urls.py 를 분리하고 config에서 연결 할 수 있도록 작업합니다. 이 글에서는 'api' app 하위에 생성 합니다.

 

1) API View

    Django Restframework 의 API View 를 활용하며, 간단한 API를 작성합니다.

    * permission_classes = [permissions.AllowAny] : Test를 위해 인증 절차를 배제하였습니다.

from django.http import HttpRequest
from rest_framework import views, permissions
from rest_framework.response import Response


class Test(views.APIView):
    permission_classes = [permissions.AllowAny]

    def get(self, request: HttpRequest):
        return Response('Test')

2) settings.py 수정

    설치한 Django Restframework와 api app을 사용할 수 있게 INSTALLED_APPS 에 추가합니다.

INSTALLED_APPS = [
    ...
    'rest_framework',
    'api',
]

 

3) api/urls.py 생성

    api app 하위에 urls.py 를 생성하고, view와 연결합니다.

# api/urls.py

from django.urls import path

from api.views import (
    Test
)


urlpatterns = [
    path('test', Test.as_view()),
]

 

4) config/urls.py 수정

    api app 하위에 생성한 urls.py 를 django project가 읽어올 수 있도록 합니다.

...

from django.urls import include


urlpatterns = [
    path('api/', include(('api.urls', 'api'))),
    path("admin/", admin.site.urls),
]

 

5) 확인

    django project를 실행하고 'api/test' 로 접속하면 아래 그림과 같이 Test API 를 확인하실 수 있습니다.

localhost:8000/api/test

 

 

6. Swagger 적용

1) drf-yasg 설치

pip install drf-yasg

 

2) config/settings.py

# config/settings.py

INSTALLED_APPS = [
    ...
    "rest_framework",
    "drf_yasg",
    "api",
]

 

3) config/urls.py

   swagger 설정 관련 code를 추가 합니다. DEBUG 모드 일 때만 접속 가능하도록 합니다.

# config/urls.py

...
from django.urls import re_path
from django.conf.urls.static import static
from django.conf import settings
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

urlpatterns = [
    path('api/', include(('api.urls', 'api'))),
    path("admin/", admin.site.urls),
]

schema_view = get_schema_view(
    openapi.Info(
        title="Django Base Project",
        default_version='v1',
        description="Django Base Project",
        terms_of_service="https://www.google.com/policies/terms/",
        contact=openapi.Contact(email="bryantjo1224@google.com"),
        license=openapi.License(name="BSD License"),
    ),
    public=True,
    permission_classes=[permissions.AllowAny],
)

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
        re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
        re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
    ]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

* schema_view : swagger 화면에 표시할 간단한 정보를 의미

 

4) 확인

localhost:8000/swagger/
localhost:8000/redoc/

 

Django Backend 개발을 위한 최소한의 setting을 해보았습니다. 이번 포스트는 기본적인 내용이라 저의 고민이나 이렇게 한 이유 등은 설명할 것이 없었습니다. 이후 업로드 할 포스트에서 고민 등을 다뤄보겠습니다. 긴 글 끝까지 읽어주셔서 감사합니다.

반응형