티스토리 뷰

Django

localLibrary 뼈대 만들기

editor752 2020. 8. 3. 16:48

본 내용은 Django 튜토리얼 사이트를 공부하면서 내용을 정리한 것이다.

TOC
0. 선행 과제
1. 프로젝트 생성
2. 애플리케이션 생성
3. 애플리케이션 등록
4. 애플리케이션 연결
5. 테스트

선행 과제

  • django 설치
  • 예제 프로젝트는 간단한 지역도서관(locallibrary) 웹서비스이다.

1부터 4까지의 과정이 끝나면 아래와 같은 디렉토리가 만들어질 것이다.

locallibrary/         # Website folder
    manage.py         # Script to run Django tools for this project (created using django-admin)
    locallibrary/     # Website/project folder (created using django-admin)
    catalog/          # Application folder (created using manage.py)

참고로 이름 뒤에 슬러시(/)가 붙어 있는 항목은 디렉토리이며 그 외의 것은 파일이다.

1. 프로젝트 생성

엄밀하게 말해서는 프로젝트 관리 스트립트(manage.py)를 생성하는 과정이다. 관리 스크립트를 생성하기 위해서는 django-admin을 사용한다.

먼저 프로젝트를 생성할 위치로 이동할 다음 아래와 같이 django-admin을 사용하여 프로젝트를 생성한다. 그러면 해당 이름의 디렉토리가 자동으로 생성되므로 이 cd 명령어를 이용하여 해당 디렉토리로 이동한다.

django-admin startproject locallibrary
cd locallibrary

그러면 아래와 같은 디렉토리(구조)를 확인할 수 있다.

locallibrary/
    manage.py
    locallibrary/
        __init__.py
        settings.py
        urls.py
        wsgi.py

manage.py는 다음 파트에서 다룰 애플리케이션을 생성하고, 데이터베이스와 작업하고, 그리고 개발 웹 서버를 시작하기 위해 사용된다. 한편 하위 locallibrary 디렉토리 안의 파일은 아래와 같은 기능을 하게 된다.

  • __init__.py: 내용이 없는 빈 파일로 이 파일은 파이썬에게 이 디렉토리를 하나의 파이썬 패키지로 다루도록 한다.

  • settings.py: 웹사이트의 모든 설정을 포함하고 있다. 이 파일에 앞으로 생성하게 될모든 애플리케이션, 정적 파일의 위치, 데이터베이스 세부 설정 등을 등록한다.

  • urls.py: 사이트의 URL과 뷰의 연결을 지정한다. 여기에는 모든 URL 매핑 코드가 포함될 수 있지만, 특정한 어플리케이션에 매핑의 일부를 할당해주는 것이 일반적이다.

  • wsgi.py: 장고 애플리케이션이 웹서버와 연결 및 소통하는 것을 돕는다. 이것을 표준 형식(boilerplate)으로 다뤄도 무방하다.
    (설명을 전혀 이해할 수 없다.)

  • asgi.py: 파이썬 비동기 웹 앱과 서버가 서로 통신하고 WSGI의 비동기 후속 작업으로 배치하는 표준이다. 상기의 WSGI는 동기 파이썬 앱에 대한 표준을 제공하며, ASGI는 비동기 및 동기 앱 모두에 하위 호환성 구현 및 여러 서버 및 응용 프로그램 프레임워크로써 WSGI를 제공합니다.
    (설명을 전혀 이해할 수 없다.)

2. 애플리케이션 생성

프로젝트 안에 포함될 애플리케이션을 생성한다. 이를 위해서는 `manage.py를 사용한다.

여기서는 locallibrary 프로젝트 아래에 catalog 애플리케이션을 만들 것이다. 이를 위해 아래와 같이 입력한다.

python3 manage.py startapp catalog

윈도우에서 작성 중이라면 아래와 같이 입력한다(python3py -3로 바꾸면 된다).

py -3 manage.py startapp catalog

catalog라는 앱이 생성되면서 전체 디렉토리 구조는 아래와 같이 바뀐다.

locallibrary/
    manage.py
    locallibrary/
    catalog/
        admin.py
        apps.py
        models.py
        tests.py
        views.py
        __init__.py
        migrations/
  • views.py: 해당 애플리케이션의 뷰(모양)와 관련된 내용이다.
  • models.py: 해당 애플레키이션의 모델(데이터베이스 구조)와 관련된 내용이다.
  • tests.py: 해당 애플리케이션의 테스트에 관련된 내용이다.
  • admin.py: 관리자 사이트 설정에 관련된 내용이다.
  • apps.py: 어플리케이션 등록(registration)에 관련된 내용과 객체(object)에 대한 작업을 위한 최소한의 표준 코드가 포함된다.
  • migrations/: 모델을 수정할 때마다 자동으로 데이터베이스를 업데이트하는 것을 가능하게 해 줄 마이그레이션 파일들을 저장할 폴더이다.

note: 위의 파일 리스트에서 뭔가 부족한게 있다는 것을 알아챘나요? 뷰와 모델 관련 파일은 있는 반면 URL 맵핑, 템플릿, 정적 파일(static file)과 연관된 파일이 없습니다. 그들을 어떻게 생성하는지에 다음을 진행하는 과정에서 설명된다.

3. 애플리케이션 등록

생성한 애플리케이션을 프로젝트에 등록한다.
앞서 만든 catalog 애플리케이션을 locallibrary 프로젝트에 등록을 해주어야 한다. 경우에 따라서는 하나의 프로젝트 아래에 여러 개의 애플리케이션을 생성하여 등록할 수 있다. 애플리케이션을 등록하기 위해서는 프로젝트 디렉토리 아래에 있는 settings.py 파일을 편집해야 한다.

편집기로 locallibrary/settings.py를 열고 INSTALLED_APPS를 검색한다. 그러면 아래의 항목을 찾을 수 있을 것이다.

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

이 부분에 'catalog.apps.CatalogConfig',을 추가하여 아래와 같이 편집한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'catalog.apps.CatalogConfig', 
]

프로젝트에게 앱과 관련된 설정이 어디에 있는지 알려주는 기능을 한다. 앞서 생성한 catalog는 해당 애플리케이션이 생성될 때 자동으로 하위 디렉토리에 apps.py 파일이 생성된다. 이 파일 안에 CatalogConfig가 아래와 같이 클래스로 지정되어 있다.

from django.apps import AppConfig


class CatalogConfig(AppConfig):
    name = 'catalog'

4. 애플리케이션 연결

각 애플리케이션에 대하여 url 및 mapper를 연결(hook up)한다.

4-1. 데이터베이스 연결

프로젝트에서 사용할 데이터베이스를 지정하는 단계이다. Django는 기본적으로 SQLite를 지원하므로 이 데이터베이스를 이용할 것이다. 이는 settings.py에서 확인할 수 있다. 즉 다른 데이터베이스를 사용하려면 이 부분을 수정해야 한다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

SQLite를 사용하는 경우 별다른 조작이 필요하지 않다. 다만 데이터베이스를 실제로 생성하기 위해서 아래와 같은 명령을 수행해 주어야 한다.

python3 manage.py makemigrations
python3 manage.py migrate

첫번째 명령(makemigrations)으로 모든 앱에 대한 마이그레이션을 수행하기 위한 파일을 만들게 된다(특정 앱만을 대상으로 할 때는 마지막에 해당 앱의 이름을 추가하면 된다). 두번째 명령(migrate)으로 실제 마이그레이션이 수행된다.

4-2. URL 맵퍼 연결

프로젝트 생성 시 디렉토리 안의 URL 맵퍼 파일(urls.py)이 함께 생성됩니다. urls.py를 통해 모든 URL 맵핑을 관리할 수 있지만, 애플리케이션에 따라 매핑을 다르게 하는 것이 일반적이다. 이를 위해서는 loacallibrary/urls.py를 편집해야 하며, 애플리케이션 하위 디렉토리에 (locallibrary/catalog/)urls.py를 생성하여 편집해주어야 한다.

먼저 프로젝트의 urls.py를 편집기로 열어 보자. 아래와 같은 코드가 보일 것이다.

"""locallibrary URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
예제:
Function views 일 경우
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views 일 경우
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
다른 참조할 URL FILE 들을 포함시켜야 하는경우
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

URL 맵핑은 맨 하단의 urlpatterns 변수를 통해 관리된다. 이 변수는 path() 함수의 파이썬 list 타입입니다. 각각의 path() 함수는 패턴이 일치할 때 표시될 뷰에 URL 패턴을 연결하거나, 다른 URL 패턴 테스트 코드 목록에 연결한다. urlpatterns 리스트는 맨 처음에 관리자 애플리케이션의 고유한 URL 맵핑 정의를 갖고 있는 admin.site.urls 모듈에 admin/이란 패턴을 가지고 있는 모든 URL을 매핑하는 단일 함수를 정의되어 있다.

note: path() 속의 경로는 일치시킬 URL 패턴을 정의하는 문자열이다. 이 문자열은 명명된(named) 변수를 꺽쇠 괄호(< >) 안에 포함할 수 있다. (예시: 'catalog/<id>/') 이 패턴은 URL을 /catalog/any_chars/ 처럼 일치시키고 any_chars를 뷰에 매개 변수 이름이 id 인 문자열로 전달합니다.

애플리케이션의 URL 맵핑을 별도로 처리할 것이기 때문에 이에 대한 내용을 최상의 urls.py에 추가해 주어야 한다. 이를 위하여 아래의 코드들을 추가한다.

# Use include() to add paths from the catalog application 
from django.conf.urls import include
from django.urls import path

urlpatterns += [
    path('catalog/', include('catalog.urls')),
]

이는 www.xxxx.com/catalog로 시작되는 요청이 들어 오면 catalog/urls.py를 참조해서 맵핑하겠다는 의미이다. 참고로 아직 이 파일은 존재하지 않으며 추후에 이 위치에서 urls.py 파일을 생성해야 한다.

다음으로 루트 URL(127.0.0.1:8000)을 127.0.0.1:8000/catalog/로 리다이렉트한다. 아래의 코드를 urls.py에 추가한다.

#Add URL maps to redirect the base URL to our application
from django.views.generic import RedirectView

urlpatterns += [
    path('', RedirectView.as_view(url='/catalog/', permanent=True)),
]

이를 위해서는 특별한 뷰 함수(RedirectView)가 사용된다. 이 함수는 path()에서 지정된 URL 패턴이 일치할 때(위의 경우에선 루트 URL) 첫 번째 인자를 (/catalog/)로 리다이렉트할 새로운 상대 URL로 간주한다.
path() 함수의 첫 번째 매개변수(parameter)를 비워 놓으면 '/'를 의미한다. 따라서 매개변수(parameter)를 '/'라고 작성하지 않아야 한다.

마지막으로 이미지와 같은 정적 파일을 사용할 때 필요한 코드를 추가한다.(만약 개발하는 사이트에서 이런 정적 파일을 이용하지 않는다면 추가할 필요가 없겠지만 일반적인 경우에는 추가하기 바란다.)

 # Use static() to add url mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static

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

지금까지는 학습을 위해 무슨 의미로 어떤 코드가 추가되었는지를 보였지만 일반적이 편집 방식은 아니다. 일반적으로는 아래와 같이 편집된다.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('catalog/', include('catalog.urls')),
    path('', RedirectView.as_view(url='/catalog/', permanent=True)),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

이제 프로젝트의 urls.py의 편집을 마치고 locallabrary/catalog/에 새로운 urls.py 파일을 생성한다. 이 파일을 열고 아래의 코드를 추가한다.

from django.urls import path
from catalog import views


urlpatterns = [

]

지금은 urlpatterns가 빈 상태이다. 앞으로 애플리케이션을 만들면서 패턴들이 이곳에 추가될 것이다.

5. 테스트

웹서버는 아래의 명령으로 실행된다.

python3 manage.py runserver

서버가 정상적으로 실행된다면 로컬 웹 브라우저에서 http://127.0.0.1:8000/으로 이동하여 사이트를 볼 수 있다.

물론 사이트 에러 페이지를 만나게 될 것이다. 하지만 이는 지금까지 과정에 문제가 있었다는 것을 의미하지는 않는다. 아직까지는 브라우저가 찾을 수 있는 페이지를 만들지 않았기 때문이다. 다음에서 이 페이지를 만들게 될 것이다. 현재로서는 장고가 작동하고 있다는 것만 확인하면 된다.

2020/08/04 - [Django] - localLibrary 모델(models.py) 편집

 

localLibrary 모델(models.py) 편집

2020/08/03 - [Django] - localLibrary 뼈대 만들기 localLibrary 뼈대 만들기 본 내용은 Django 튜토리얼 사이트를 공부하면서 내용을 정리한 것이다. TOC 0. 선행 과제 1. 프로젝트 생성 2. 애플리케이션 생성 3..

editor752.tistory.com

 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
05-18 17:43