장고(Django) | 앱 생성하기
지난 글에서 서버 실행 시 떴던 경고문에 migratsion을 해야한다는 문구가 있었다.
이번 글에서는 migartion을 하고 웹사이트 기초를 만들어보겠다.
1. Migration
마이그레이션은 모델의 변경 내역을 DB 스키마에 적용시키는 것으로 쉽게 말해
modles.py에 정의된 모델의 생성/변경 내역을 히스토리 관리, DB에 적용 등의 기능을 제공하여
DB의 구조를 쉽게 바꾸는 기능이다.
▶ 관련 명령어는 여기 클릭
프로젝트 생성 후 첫 마이그레이션은 DB를 생성한다.
python manage.py migrate
위 코드를 입력하면 아래와 같은 문구가 뜬다.
2. 관리자 계정 생성
python manage.py createsuperuser
위 코드 입력 후 터미널에 Username과 Email, PW를 차례로 입력한다.
PW는 두 번 입력해야하며 보안 상 화면에는 표시되지 않는다.
superuser(관리자) 계정을 생성했으면 전과 마찬가지로 서버를 구동한다.
http://l127.0.0.1:8000/admin 페이지에 접속하여 위에서 설정한 정보를 입력 후 LOG IN 버튼을 누르면
' Django Administration ' 이라고 써진 화면이 나타난다.
장고 관리자에 대한 글은 여기 클릭
3. 앱 생성
이전 글에서 mysite 프로젝트를 생성하였지만 프로젝트 단독으로는 어떠한 기능도 실행할 수 없다.
사이트에 기능을 추가하기 위해서는 앱을 생성해야 한다.
ctrl-c로 서버 종료 후 아래 코드를 입력하여 blog와 single_pages, test_pages라는 APP을 생성하였다.
python manage.py startapp blog
python manage.py startapp single_pages
python manage.py startapp test_pages
앱은 기능을 단위로 묶인 파일이므로 하나의 프로젝트에 여러 개를 생성할 수 있다.
이번 mysite프로젝트에서는 test_pages만 쓸 계획이므로 나머지는 생성 후 삭제해도 된다.
JupyterLab에서 확인하면 각 app에 대하여 .py 파일들이 자동 생성됨을 알 수 있다.
3. URL과 View
브라우저에서 http://127.0.0.1:8000/test_pages 페이지를 요청했을 때 " 안녕하세요 puddinghong 입니다."
라는 문자열을 출력하도록 만들어보겠다.
먼저, 로컬 서버를 구동시킨다.
python manage.py runserver
구동 후 브라우저에서 http://127.0.0.1:8000/test_pages 페이지를 열면 아래와 같이 나온다.
오류 내용을 읽어보면 mysite/urls에 test_pages URL에 해당되는 매핑이 없다고 적혀 있다.
오류 해결을 위해 총 세 가지의 작업을 해야한다.
1. ulrs.py 파일에 App의 url 추가
2. App의 url이 입력됐을 때 수행할 동작 추가
3. 2번이 수행됐을 때 화면에 보여질 Front-end 구성 추가
Django의 urls.py는 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 URL과 View 함수 간의 매핑을 정의한다.
View 함수는 Views.py 파일에 정의된 함수를 말한다.
① urls.py
mysite/urls.py 파일을 보면 다음과 같이 되어있을 것이다.
(urls.py 파일은 프로젝트에만 있다. 앱에는 x)
→ 빨간 글씨로 urls.py 파일 코드에 대한 설명이 나와있다.
→ 'urlpatterns' 리스트는 해당 url을 views.py 파일로 전달하여 요청한 함수를 불러온다.
→ 이렇게 불러온 함수는 from '앱이름' import '함수명' 으로 입력하여 사용한다.
나는 test_pages를 요청하여 페이지를 볼 것이기 때문에 urls.py 파일을 다음과 같이 수정하였다.
수정 후 페이지를 요청해도 오류가 뜰 것이다. 아직 views.index 가 생성되지 않았기 때문이다.
from django.contirb import admin
from django.urls import path
from test_pages import views
urlpatterns = [
path('admin.', admin.site.urls),
path('test_pages/', views.index),
]
▲ test_pages/ 의 url이 요청되면 views.index를 호출한다. views.index는 views.py파일의 index 함수를 의미한다.
urlpatterns에서 실제 URL은 http://127.0.0.1:8000/test_pages 이지만 매핑은 test_pages/ 로 한다.
호스트(127.0.0.1)와 포트(:8000)는 서버 환경에 따라 변하기 때문이다.
또, 매핑시 App 이름 뒤에 슬래시( / )를 붙여쓴다.
② views.py
위에서 views.py 파일에서 views.index 함수를 불러왔으므로 test_pages/views.py 파일에 index 함수를 추가해야한다.
파이썬에서 함수를 정의했던 것과 같은 방법으로 함수를 추가하면 된다.
페이지에 연결하면 " 안녕하세요 puddinghong 입니다. " 라는 문구를 보일 것이므로
views.py 파일을 다음과 같이 수정하였다.
from django.shortcuts import render
from dajngo.http import HttpResponse
def index(request):
return HttpResponse(" 안녕하세요 puddinghong 입니다. ")
▲ HttpResponse는 요청 페이지에 대한 응답을 할 때 사용하는 장고 클래스이다. 매개변수 request에 대해서는 후에 다룰 예정이다.
index 함수 추가 후 다시 http://127.0.0.1:8000/test_pages 페이지를 요청해보았다.
③ urls.py 수정
이렇게 처음으로 Django를 이용하여 App을 생성하고 원하는 페이지를 생성해보았다.
그런데 이대로는 매번 test_pages에 관련된 URL 매핑을 추가할 때마다 mysite/urls.py 파일을 수정해야 한다.
mysite의 urls.py 파일은 앱보다는 프로젝트 성격의 파일이므로 test_pages에서만 사용하는 URL매핑을
매번 urls.py파일에 추가하는 것은 좋은 방법이 아니다.
urls.py 파일을 다시 보면 이에 대한 설명문(?)이 나와있다.
빨간 글씨 부분을 잘 보면 이런 문구가 있다.
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
위 설명에 따라 기존의 mysite/urls.py 파일을 수정하였다.
설명을 읽고 수정된 부분을 보면 이해가 빠를 것이다.
from django.contrib import admin
from django.urls import path
from test_pages import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test_pages/', views.index),
]
▲ 수정 전
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('test_pages/', include(test_pages.urls)),
]
▲ 수정 후
수정 전/후 를 살펴보면
path( 'test_pages/' , views.index ) → path( 'test_pages/' , 'include( 'test_pages.urls' ) ) ,
from django.urls import path → from django.urls import path, include 로 변경 되었고
from test_pages import views 는 삭제되었다.
path( 'test_pages/' , 'include('test_pages.urls')) 는 test_pages/ 로 시작하는 페이지를 요청하면
test_pages/urls.py 파일의 매핑 정보를 읽어서 처리하라는 의미이다.
이로써 test_pages/ 로 시작하는 URL을 추가할 때 test_pages/urls.py 파일만 수정하면 된다.
이제 test_pages/urls.py 파일을 생성해야 한다.
파일 생성 방법은 [test_pages → 마우스 우클릭 → New File] 순으로 클릭하고 파일명을 urls.py로 지정한다.
생성된 test_pages/urls.py 파일은 다음과 같이 작성한다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
기존 mysite/urls.py 파일에서 path의 첫 번째 인자였던 test_pages/ 가 생략된 이유는 mysite/urls.py 파일에서 이미 test_pages/ 로 시작하는 URL이 test_pages/urls.py 파일과 먼저 매핑되었기 때문이다.
만약 test_pages/urls.py 파일에서 path( '1/' , ... ) 라는 URL매핑이 추가되면 최종 URL은 test_pages/1 이 된다.
다시 http://127.0.0.1:8000/test_pages 페이지를 요청했을 때에도 페이지가 정상적으로 나옴을 확인할 수 있다.