본문 바로가기

Pyhon/Django

[Pyhon/Django] 장고 기초#003.장고 서버 실행하기

프로젝트 구조

장고 프로젝트를 생성하였고, 파이썬 가상 환경을 구축(선택)하였다면 장고 서버를 실행 할 수 있습니다. 우선 장고 프로젝트의 디렉토리 구조를 살펴봅니다. 저는 이전 문서에서 helloWorld라는 장고 프로젝트를 생성했습니다.

  • manage.py
  • helloWorld
    • __init__.py
    • __pycache__
    • asgi.py
    • settings.py
    • urls.py
    • wsgi.py

*.py 확장자는 파이썬 스크립트 파일(Python script file)을 의미합니다. 장고 서버를 최초 실행하기 위해서는 manage.py와 settings.py만 확인하여도 문제 없으며, 다른 스크립트 파일은 차후에 하나씩 알아보도록 하겠습니다(이 문서에서는 장고 서버 실행을 위한 가장 기본적인 내용만 소개합니다).

기본 설정 변경

settings.py 파일을 열고 다음 내용을 확인합니다. 파일은 vi 커맨드, Xcode 등 어떤 것으로 열어도 무관합니다. 파이썬 개발 IDE 관련해서는 다음 문서에서 소개하도록 하겠습니다.

TIME_ZONE = 'utc'

타임존(Timezone) 항목을 확인하면, 디폴트 값인 UTC(Coordinated universal time)로 설정되어 있는 것을 볼 수 있습니다. 서버의 타임존이란 머신/서버에 대한 기준 시간대를 의미하며, UTC는 협정 세계시로써 전 세계가 이 시간을 기준으로 나라 별 시간을 상대적으로 표기합니다. 한국 표준 시간은 UTC+9시간에 해당하며, 다시 말해서 한국 현지 시간에서 9시간을 뺀 것이 UTC+0에 해당합니다. 현지 시간으로 12월 7일 오전 7시라면, UTC+0 기준으로 12월 6일 오후 22시에 해당합니다.

TIME_ZONE = 'Asia/Seoul'

개발하는 장고 프로젝트의 목적에 따라서 타임존을 지정하면 되며, 우리는 학습용 프로젝트이므로 한국 현지 시간을 기준 시간(Asia/Seoul)으로 설정합니다.

BASE_DIR = Path(__file__).resolve().parent.parent

(...)

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

다음으로 정적 리소스에 대한 배포를 위해 STATIC_ROOT 값을 추가합니다. STATIC_URL을 검색하여, 하단에 위 내용을 추가하면 됩니다. BASE_DIR는 이 프로젝트의 경로를 의미하며, os.path.join은 2번째 파라미터인 'static' 문자열과 경로를 이어 붙인 값을 리턴하는 함수입니다.

ALLOWED_HOSTS = []

ALLOW_HOSTS는 이 장고 프로젝트의 실행 서버에 대한 접근 가능 호스트(Host)에 대한 설정입니다. 어떤 IP를 갖는 호스트에 대해서 허용 할 것인지 입력하면 되며, 학습 단계에서는 보안에 대한 이슈가 없으므로 디폴트 값([])으로 두도록 하겠습니다.

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

장고의 디폴트 데이터베이스(Database)는  sqlite3입니다. 이 역시 디폴트 값을 그대로 사용하며, 데이터베이스 변경에 대해서는 다른 문서에서 심층적으로 다루도록 하겠습니다.

장고 서버 실행

장고 서버를 최초 실행하기 위해서, 다음 커맨드를 입력하여 데이터베이스를 마이그레이션(Migration)합니다. 마이그레이션에 대한 내용 역시 다른 문서에서 다루도록 하겠습니다.

$ python manage.py migrate

만약, 다음과 같이 마이그레이션이 실패하였다면 현재 가상 환경(Virtualenv)에 장고 패키지가 설치되지 않았기 때문입니다. 이전 문서를 그대로 따라왔다면, 장고 패키지를 글로벌 환경에서 설치 후 가상 환경을 소개했기 때문에 현재 사용 중인 가상 환경에서 장고를 추가 설치해야 합니다.

Traceback (most recent call last):
  File "/Users/namepgb/Desktop/Django/Projects/helloWorld/manage.py", line 11, in main
    from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'
$ pip3 install Django==3.2.9
$ python manage.py migrate

장고를 설치하였으나 다음 에러가 추가적으로 발생 할 수 있습니다.

Traceback (most recent call last):
  File "/Users/namepgb/Desktop/Django/Projects/helloWorld/manage.py", line 22, in <module>
    main()
  File "/Users/namepgb/Desktop/Django/Projects/helloWorld/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/Users/namepgb/Desktop/Django/Virtualenv/helloWorld/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/Users/namepgb/Desktop/Django/Virtualenv/helloWorld/lib/python3.9/site-packages/django/core/management/__init__.py", line 363, in execute
    settings.INSTALLED_APPS
  File "/Users/namepgb/Desktop/Django/Virtualenv/helloWorld/lib/python3.9/site-packages/django/conf/__init__.py", line 82, in __getattr__
    self._setup(name)
  File "/Users/namepgb/Desktop/Django/Virtualenv/helloWorld/lib/python3.9/site-packages/django/conf/__init__.py", line 69, in _setup
    self._wrapped = Settings(settings_module)
  File "/Users/namepgb/Desktop/Django/Virtualenv/helloWorld/lib/python3.9/site-packages/django/conf/__init__.py", line 170, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/Users/namepgb/Desktop/Django/Projects/helloWorld/helloWorld/settings.py", line 121, in <module>
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
NameError: name 'os' is not defined

settings.py에서 os 모듈을 찾지 못하고 있으므로 파일을 수정하여 해당 모듈을 import 할 수 있도록 합니다. from pathlib import Path 구문 위에 입력해주면 됩니다.

import os

from pathlib import Path

모든 문제가 해결되었다면, 마이그레이션을 다시 실행합니다. 아래와 같이 출력되면 정상적으로 진행 된 것입니다.

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

마이그레이션이 종료되면 이제 장고 서버를 실행 할 수 있습니다. 서버를 실행기 위해서는 manage.py 파이썬 스크립트 파일을 runserver 합니다.

$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
December 06, 2021 - 07:19:59
Django version 3.2.9, using settings 'helloWorld.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

서버가 실행되면 실행 일자와 장고 버전, 셋팅 파일 이름 등이 출력됩니다. 이 상태에서 Control+C를 입력하면 서버를 종료합니다. 서버가 실행 중인 상태에서 크롬과 같은 인터넷 브라우저 주소 창에 http://127.0.0.1:8000/를 입력하면 실행 중인 장고 서버의 웹 사이트에 접속 할 수 있습니다.

장고 서버가 실행 중인 터미널에서도 웹 사이트 응답에 따른 로그가 기록 되고 있는 것을 확인 할 수 있습니다.

[06/Dec/2021 07:57:23] "GET / HTTP/1.1" 200 10697
[06/Dec/2021 07:57:24] "GET /static/admin/css/fonts.css HTTP/1.1" 304 0
[06/Dec/2021 07:57:24] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 304 0
[06/Dec/2021 07:57:24] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 304 0
[06/Dec/2021 07:57:24] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 304 0

여기까지 잘 따라오셨다면, 장고 프로젝트의 설치와 가상 환경 구축, 그리고 서버 실행까지 완료한 것입니다. 다음 문서부터는 장고 프로젝트 개발을 위한 IDE 설치 및 실제 개발에 대한 내용을 다루도록 하겠습니다.