본문 바로가기
Django

01. Django 설치, Django project의 구성 요소들

by ㅣlㅣl 2024. 2. 15.

본 포스팅은 생활코딩 이고잉님의 강의 'Python Django Web Framework', Django Documentation을 토대로 작성된 포스팅입니다.


웹페이지를 미리 만들어두고 띄우는 상태에서는 하나의 코드를 수정할 때마다 각 페이지에 따로 반영을 해주어야 하고, 사용자의 투고를 받아서 웹페이지를 만들 때에도 개발자가 직접 페이지를 제작해주어야 한다.

웹페이지를 만드는 부분 중 많은 부분은 공통적이며, 이를 이용해 웹페이지를 만드는 '공장'을 만들도록 해둔 것이 바로 Web Framework이다.

 

Django 설치하기

  • 패키지 설치 (pip)
python3 -m pip install django

 

  • project 만들기
django-admin startproject [project_name] [project_folder]
  • django-admin은 관리작업을 위한 command line utility

실행하면 아래와 같은 디렉토리 & 파일들이 생성된다.

myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

 

 

생성된 파일들 알아보기

manage.py

https://docs.djangoproject.com/en/5.0/ref/django-admin/#cmdoption-startapp-template

Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티.
해당 파일을 실행시켜서 웹앱 프로젝트를 동작시킬 수 있다.

django project를 생성할 때마다 함께 자동으로 생성되며, 앞서 설명한 django-admin과 동일한 작업을 수행하지만 settings.py를 가리키도록 환경변수가 지정되어 있다.

많은 명령어가 존재하지만, 우선적으로 아래 명령어를 기억해두자.

 

startproject

django-admin startproject [project_name] [project_folder]
  • 앞서 살펴봤듯 django project를 생성하는 명령어

 

runserver

django-admin runserver [PORT_NUM]
  • 생성된 프로젝트 서버를 실행하는 명령어
  • 포트 번호를 입력하지 않으면 8000번 포트에서 동작

포트에 대해서는 이후에 다시 다루겠지만, 우선은 각 프로세스를 구분하기 위해 지정해주는 번호라고 알고 넘어가면 될 것 같다.

80번 포트를 이용하는 서버 (출처: 생활코딩 django 강의)

 

  • IP 주소는 기본으로 127.0.0.1로 지정되며, 다른 시스템에서 액세스할 수 없음
    다른 컴퓨터에서 접속하게 하려면 자체 IP 주소를 지정하거나, 0 또는 :: 을 지정해줘야 함
    ex. IPv4 포트 7000 1.2.3.4:
    django-admin runserver 1.2.3.4:7000​

    ex. IPv6 주소의 포트 7000 2001:0db8:1234:5678::9:
    django-admin runserver [2001:0db8:1234:5678::9]:7000​
  • WSGI_APPLICATION setting에 지정된 WSGI application object를 사용
  • 별도의 포트 번호를 지정해줄 경우 두 개 이상의 서버를 동시에 실행 가능

 

startapp

django-admin startapp name [directory]
  • 지정된 directory에 지정된 앱 이름으로 app을 만들어줌
  • app의 개념은 이후 다시 설명
  • 옵션 추가로 다양한 추가 설정 가능
  • --template : custom project template 경로 지정
    ex.
    django-admin startapp --template=/Users/jezdez/Code/my_app_template myapp​
  • --extension : 템플릿 엔진을 사용해 렌더링해야 하는 앱 템플릿의 파일 확장자 지정 (기본 값 py)
  • --exclude : .git 이외 제외해야 하는 앱 템플릿의 디렉토리 지정

 

__init__.py

Python으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 빈 파일

 

settings.py

https://docs.djangoproject.com/ko/5.0/topics/settings/

현재 Django 프로젝트의 환경 및 구성을 저장

django를 사용할 때 어떤 환경 구성을 사용하는 지 알려주기 위해 DJANGO_SETTINGS_MODULE을 환경변수로 지정해준다.

다음과 같은 방법으로 지정이 가능하다.

set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
django-admin runserver --settings=mysite.settings

 

또한 WSGI application에서도 os.environ을 통한 변수 설정이 필요하다.

import os

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

 

이미 기본 설정값은 global_settings.py에 지정이 되어있기 때문에 필요에 따라 전역 설정을 재정의하여 지정된 설정 파일에서 설정을 로드하면 된다.

또한 python manage.py diffsettings 명령어를 통해 현재 설정 파일과 Django의 기본 설정 간의 차이점을 표시할 수 있다.

설정에 포함된 각종 변수들에 대한 설명은 documentation에 자세히 나와있다.

 

urls.py

현재 Django project 의 URL 선언을 저장= Django 로 작성된 사이트의 “목차” 
사용자가 접속하는 path에 따라 그 요청을 어떻게 /누가 처리할지 (=라우팅할지) 처리

앱의 URL을 디자인하기 위해 URLconf라고 하는 python 모듈을 만든다.

URLconf는 URL 경로 표현식 - Python 함수 (View) 간의 매핑을 담당한다.

 

Django가 request를 처리하는 방식

  1. 사용할 root URLconf 모듈을 정한다. (해당 값은 settings의 ROOT_URLCONF 변수에 설정)
  2. 파이썬 모듈을 load하고 변수 urlpattern을 찾음
  3. 각 urlpattern을 순서대로 실행하고 요청된 url과 일치하면 지정된 view를 가져와서 호출
  4. 일치하는 url 패턴이 없을 경우에는 에러 처리 view를 호출함 https://docs.djangoproject.com/en/5.0/topics/http/urls/#error-handling

 

urlconf 구성 예시

예를 들어 아래와 같은 urlconf 파일이 있다고 하자.

# urlconf.py

from django.urls import path

from . import views

urlpatterns = [
    path("articles/2003/", views.special_case_2003),
    path("articles/<int:year>/", views.year_archive),
    path("articles/<int:year>/<int:month>/", views.month_archive),
    path("articles/<int:year>/<int:month>/<slug:slug>/", views.article_detail),
]

 

 '/articles/2005/03/' 에 대한 request가 들어왔다면, 3번째 패턴에 match될 것이고 django는 views.month_archive(request, year=2005, month=3) 를 호출할 것이다.

 

' /articles/2003' 에 대한 request는 어떻게 처리될까?

정답은 '처리되지 않는다'.

URL은 모두 /로 끝나야하기 때문에 어느 패턴에도 매치되지 않고, 이는 결국 에러를 일으킬 것이다.

 

다음과 같이 정규식을 사용해서 urlpattern을 나타낼 수도 있다.

from django.urls import path, re_path

from . import views

urlpatterns = [
    path("articles/2003/", views.special_case_2003),
    re_path(r"^articles/(?P<year>[0-9]{4})/$", views.year_archive),
    re_path(r"^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$", views.month_archive),
    re_path(
        r"^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$",
        views.article_detail,
    ),
]

 

urlconf의 검색 방법

urlconf는 request를 검색할 때, url을 단순한 string으로 다루며 이는 GET, POST 파라미터나 도메인 이름을 포함하지 않는다.

예를 들어 https://www.example.com/myapp/ , https://www.example.com/myapp/?page=3 2개의 request가 있다고 할 때, urlconf는 두 요청에 모두 myapp/으로 라우팅시켜준다.

따라서 편리하게 특정 페이지를 보여주기 위해서는 view의 파라미터에 기본 인자를 지정해주는 것이다.

# URLconf
from django.urls import path

from . import views

urlpatterns = [
    path("blog/", views.page),
    path("blog/page<int:num>/", views.page),
]


# View (in blog/views.py)
def page(request, num=1):
    # Output the appropriate page of blog entries, according to num.
    ...

 

 

다른 URLconf를 포함하기

직접 path를 지정해주는 방법 뿐만 아니라, 다른 URLconf 모듈을 포함할 수도 있다.

from django.urls import include, path

urlpatterns = [
    # ... snip ...
    path("community/", include("aggregator.urls")),
    path("contact/", include("contact.urls")),
    # ... snip ...
]

다음과 같이 공통 접두사를 한 번만 지정하고, 나머지를 그룹화해서 코드 가독성을 높일 수도 있다.

from django.urls import include, path
from . import views

urlpatterns = [
    path(
        "<page_slug>-<page_id>/",
        include(
            [
                path("history/", views.history),
                path("edit/", views.edit),
                path("discuss/", views.discuss),
                path("permissions/", views.permissions),
            ]
        ),
    ),
]

또한 포함된 urlconf는 상위 urlconf의 파라미터를 그대로 갖는다.

# In settings/urls/main.py
from django.urls import include, path

urlpatterns = [
    path("<username>/blog/", include("foo.urls.blog")),
]

# In foo/urls/blog.py
from django.urls import path
from . import views

urlpatterns = [
    path("", views.blog.index), # 인자를 지정해주지 않아도 username 변수가 전달됨
    path("archive/", views.blog.archive),
]

 

asgi.py

현재 프로젝트를 서비스하기 위한 ASGI-호환 웹 서버의 진입점

 

wsgi.py

현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점

참고 자료

https://youtu.be/pbKhn2ten9I?si=NtCIfKXs9RozEzaQ

https://opentutorials.org/course/4886/31111

https://docs.djangoproject.com/ko/5.0/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

'Django' 카테고리의 다른 글

04. 홈페이지 기능 구현 - Read  (1) 2024.02.15
03. App 만들기 (2)  (1) 2024.02.15
02. App 만들기 (1)  (0) 2024.02.15