프로젝트의 Django 관리 명령은 python manage.py <command> 형식으로 실행하기.
Django가 관리하는 명령이 수십개가 될것이다.
runserver.py
migrate.py
makemigrations.py
createsuperuser.py
collectstatic.py
...
각각의 실행 파일을 만드는 대신 manage.py 를 하나 만들고, Django 패키지에 내부에 있는 매부 management command를 가져다 쓸 수 있도록 만들자.
Django
└── django
└── core
└── management
└── commands
├── runserver
├── migrate
├── makemigrations
├── createsuperuser
└── ...
python manage.py runserver
python manage.py migrate
python manage.py makemigrations
python manage.py createsuperuser
+
물론 이 구조에서 사용자 정의 Command를 만들어 실행할 수도 있다.
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = "Second Brain 테스트 명령"
def handle(self, *args, **options):
self.stdout.write("Hello Second Brain!")
python manage.py hello
manage.py 설정하기
DJANGO_SETTINGS_MODULE, env, 기본설정파일은 config/settings로 설정.
django.core.management의 execute_from_command_line를 import해서 Django 패키지 내부 함수를 가져오고 실패한다면 ImportError발생시키자.
이로써 사용자 명령 sys.argv를 가져다가 execute_from_command_line해 실행명령을 통일함으로써 .py를 직접 실행하는 구조가 아닌 'python manage.py' 와 같이 통일된 CLI 방식으로 모든 Django 관리명령을 실행한다.
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Django를 가져올 수 없습니다. Django가 설치되어 있고 "
"PYTHONPATH 환경 변수에서 사용할 수 있는지 확인해 보세요. "
"가상 환경을 활성화하는 것을 잊으셨나요?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
효과가 있다면
만약 각각 사용자가 python 파일을 직접 실행해린다면 각각의 실행 파일 위치와 실행 방식까지 신경 써야 할 수있다.
각각의 Django 관리 명령을 개별 Python 파일로 직접 실행하게 하지 않고, manage.py라는 하나의 진입점을 통해 python manage.py <command> 형태로 사용된다 .
python runserver.py
python migrate.py
python makemigrations.py
python createsuperuser.py
python shell.py
python collectstatic.py
python manage.py runserver
python manage.py migrate
python manage.py makemigrations
python manage.py createsuperuser
python manage.py shell
python manage.py collectstatic
+ manage.py에서 os.environ.setdefault DJANGO_SETTINGS_MODULE로 설정됬던 config.setting를 살펴보자 .
Django 프로젝트 전체 설정을 모아놓은 파일
프로젝트 root 설정
DJANGO_SECRET_KEY 환경변수값을 찾고 없으면 기본값을 사용한다.
DJANGO_DEBUG가 1 이면 true.
ALLOWED_HOSTS 우선 모두 열어놓기
INSTALLED_APPS 이 프로젝트에서 사용할 앱들.
MIDDLEWARE HTTP 요청과 응답 사이를 지나가는 처리계층, 보안, session, 일반적인 http처리, csrf 공격방어, 인증정보연결, 메세지기능 및 Clikjacking 공격 방어등이 추가될 수 있다.
ROOT_URLCONF url 설정 파일
TEMPLATES Django의 기본 Template Engine을 사용하되 templates란 파일, 또는 앱 내부의 templates 폴더를 찾아 dirs 설정.
- context_processors 공통 데이터를 자동으로 전달하는 기능, debug, request, auth, message, current_user 공통 데이터를 자동으로 전달되어 여러 html에서 바로 사용할 수 있다.
WSGI_APPLICATION WSGI 서버와 연결하기 위한 진입점 파일 설정.
DATABASES SQlite 사용, 엔진은 django, 파일경로 설정.
AUTH_PASSWORD_VALIDATORS 사용자의 비밀번호 검증 규칙 설정, google oauth 로그인만 사용한다면 적용되지않지만 기본 인증 시스템을 사용할 경우를 대비해서 기본적으로 정
- UserAttributeSimilarityValidator 이름과 너무 비슷한 비밀번호 막기
- MinimumLengthValidator 최소길이 검사
- CommonPasswordValidator 흔한 비밀번호 막기
- NumericPasswordValidator 숫자로만 이루어진 비밀번호 막기
LANGUAGE_CODE , TIME_ZONE 언어, 시간대 설정
USE_I18N 국제화 기능, 여러 언어를 지원할 수 있도록 한다.
USE_TZ 타임존 datetime 설정하기, 시간대가 있는 dateime을 설정해 기본시간대는 서울로 하되 명확한 zone이 포함된 datetime을 설정함.
Static 정적 파일 설정, staticfiles는 배포를 위해 파일을 한곳으로 모을때 사용하는 위치. media도 따로 설정
comming soon은 커스텀 설정으로 별도로 관리하도록 하자.
LOGIN_URL 로그인이 필요한 페이지에 접근시 login으로 보내기
DEFAULT_AUTO_FIELD 기본 primary key를 BigAutoField로 자동으로 id를 마들도록 세팅
import os
from pathlib import Path
# root 설정
BASE_DIR = Path(__file__).resolve().parent.parent
# Django 보안용 비밀키
SECRET_KEY = os.environ.get(
'DJANGO_SECRET_KEY',
'django-insecure-g5kivm4s(k)76v=%x!pwgun5pam+abf%r1wp7cocm@4g%bf(6o',
)
DEBUG = os.environ.get('DJANGO_DEBUG', '1') == '1'
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apps.accounts',
'apps.dashboard',
'apps.projects',
'apps.management',
'apps.comingsoon',
]
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': [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',
'apps.accounts.context_processors.current_user',
],
},
},
]
WSGI_APPLICATION = 'config.wsgi.application'
# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/5.0/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/5.0/topics/i18n/
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/
STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = 'media/'
MEDIA_ROOT = BASE_DIR / 'media'
# Coming Soon 문서는 DB가 아닌 파일 기반으로 관리한다.
COMING_SOON_DIR = BASE_DIR / 'content' / 'coming_soon'
COMING_SOON_DELETED_DIR = COMING_SOON_DIR / 'deleted'
LOGIN_URL = '/login/'
# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
ROOT_URLCONF = 'config.urls'의 urls.py를 살펴보자 .
현 프로젝트는 관리자용 화면이 포함되어있으니 헷갈리지않도록 django-admin으로 설정하도록 한다.
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('django-admin/', admin.site.urls),
path('', include('apps.dashboard.urls')),
path('', include('apps.accounts.urls')),
path('projects/', include('apps.projects.urls')),
path('manage/', include('apps.management.urls')),
path('coming-soon/', include('apps.comingsoon.urls')),
]
'Portfolio' 카테고리의 다른 글
| S brain - 기획 - 사용해보고 싶은 기술들 (0) | 2026.08.21 |
|---|---|
| S brain - front - Scaffolding - run.bat 설정하기 (0) | 2026.08.20 |
| S brain - front - Scaffolding - comming soon (0) | 2026.08.19 |
| S brain - front - Scaffolding - Sample Pages (0) | 2026.08.19 |
| SHS RAG 기반 교내 규정 질의응답 서비스 (feat.LLM) (0) | 2026.08.10 |