장고

장고(Django) | 앱 생성하기

PuddingHong 2022. 1. 19. 18:06
728x90
반응형

지난 글에서 서버 실행 시 떴던 경고문에 migratsion을 해야한다는 문구가 있었다.

이번 글에서는 migartion을 하고 웹사이트 기초를 만들어보겠다.


1. Migration

마이그레이션은 모델의 변경 내역을 DB 스키마에 적용시키는 것으로 쉽게 말해

modles.py에 정의된 모델의 생성/변경 내역을 히스토리 관리, DB에 적용 등의 기능을 제공하여

DB의 구조를 쉽게 바꾸는 기능이다.

▶ 관련 명령어는 여기 클릭

 

프로젝트 생성 후 첫 마이그레이션은 DB를 생성한다.

python manage.py migrate

 

위 코드를 입력하면 아래와 같은 문구가 뜬다.

 

2. 관리자 계정 생성

python manage.py createsuperuser

 

위 코드 입력 후 터미널에 Username과 Email, PW를 차례로 입력한다.

PW는 두 번 입력해야하며 보안 상 화면에는 표시되지 않는다.

PW는 최소 8글자로 설정하거나 y를 입력하여 기호에 맞게 설정하면 된다.

 

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  페이지를 열면 아래와 같이 나온다.

요청한 페이지를 찾을 수 없는 경우 Page not found (404) 라는 오류코드를 출력한다.

오류 내용을 읽어보면 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로 지정한다.

확장자를 .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  파일과 먼저 매핑되었기 때문이다.

         ▲mysite/urls.py                                                                              ▲test_pages/urls.py        

 

만약  test_pages/urls.py  파일에서 path( '1/' , ... ) 라는 URL매핑이 추가되면 최종 URL은  test_pages/1 이 된다.

 

 

다시  http://127.0.0.1:8000/test_pages  페이지를 요청했을 때에도 페이지가 정상적으로 나옴을 확인할 수 있다.

728x90