본문 바로가기

혼자하는 프로젝트/Django

Django 기본요소 학습 (url과 view)

728x90
반응형

# 게시판 역할을 할 pybo 앱을 생성한다.

(mysite) C:\projects\mysite>django-admin startapp pybo
(mysite) C:\projects\mysite>

- 명령을 실행하면 아무런 반응이 없지만 파이참 소스파일 리스트에서는 pybo 폴더가 생성된 것을 확인 할 수 있다.

# 장고 프로그램을 개발해보자

url 창에 http://localhost:8000/pybo 주소를 입력했을때, "안녕하세요 pybo에 오신것을 환영합니다."라는 문자열이 출력 되도록 만들어보자.

- 로컬 서버를 먼저 구동한다.

(mysite) C:\projects\mysite> python manage.py runserver

- 그리고 브라우저에 http://localhost:8000/pybo url주소를 입력해보자.

- 아래와 같이 페이지를 찾을 수 없습니다 라는 경고와 함께 페이지가 출력되는것을 볼 수 있다.

- 장고는 오류가 발생하면 오류의 원인을 화면에 자세히 보여주기 때문에 오류를 파악하기 쉽다. 오류의 내용을 자세히 읽어보면 config/urls.py 파일에 요청한 /pybo URL에 해당되는 매핑이 없다고 적혀 있다.
그렇다면 오류를 해결하기 위해 해야 할일은 무엇일까? config/urls.py 파일에 /pybo URL에 대한 매핑을 추가하는 것이다. 장고의 urls.py 파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 URL과 뷰 함수 간의 매핑을 정의한다. 뷰 함수는 views.py 파일에 정의된 함수를 말한다.

 

# urls.py 파일 수정

- URL 매핑을 추가하기 위해 config/urls.py 파일을 다음과 같이 수정하자.

from django.contrib import admin
from django.urls import path
from pybo import views

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

pybo/ URL이 요청되면 views.index를 호출하라는 매핑을 urlpatterns에 추가, views.index는 views.py 파일의 index 함수를 의미한다.

urlpatterns에서 실제 URL은 http://localhost:8000/pybo 이지만 호스트명과 포트가 생략된 pybo/로 매핑해야 한다. 왜냐하면 호스트(예:localhost)와 포트(예:8000)는 환경에 따라 변하기 때문이다.

또 한가지 pybo/ 를 pybo라고 하지 않고 뒤에 슬래시(/)를 하나 더 붙여 주었다. 이렇게 뒤에 슬래시를 붙여주면 브라우저 주소창에 http://localhost:8000/pybo 라고 입력해도 자동으로 http://localhost:8000/pybo/ 처럼 변환된다. 이렇게 되는 이유는 URL을 정규화하는 장고의 기능 때문이다. 특별한 경우가 아니라면 URL 매핑시 항상 끝에 슬래시를 붙여주는것이 좋다.

 

views.py

이제 다시 http://localhost:8000/pybo 페이지를 요청해 보자. 아마도 한참 후에 "사이트에 연결할 수 없음"이라는 오류가 화면에 표시될 것이다. 그리고 로컬 서버에는 다음과 같은 오류가 출력될 것이다.

  File "c:\projects\mysite\config\urls.py", line 23, in <module>
    path('pybo/', views.index),
AttributeError: module 'pybo.views' has no attribute 'index'

오류의 원인은 위에서 URL 매핑에 추가한 뷰 함수 views.index가 없기 때문이다. 그렇다면 이제 pybo/views.py 파일에 index 함수를 추가해야 할 것이다. 다음과 같이 추가해 보자.

- 파일이름: c:\projects\mysite\pybo\views.py

from django.http import HttpResponse


def index(request):
    return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")

HttpResponse는 요청 페이지에 대한 응답을 할때 사용하는 장고 클래스이다. 여기서는 "안녕하세요 pybo에 오신것을 환영합니다." 라는 문자열을 브라우저에 출력하기 위해 사용되었다. index 함수의 매개변수 request는 장고에 의해 자동으로 전달되는 HTTP 요청 객체이다. 이렇게 뷰 함수를 작성하고 다시 http://localhost:8000/pybo 페이지를 요청해 보자.

다음과 같은 결과를 볼 수 있을 것이다.

장고 개발 흐름

- 장고의 기본적인 흐름

위 그림의 흐름은 브라우저에서 로컬 서버로 http://localhost:8000/pybo 페이지를 요청하면 1. urls.py 파일에서 /pybo URL 매핑을 확인하여 views.py 파일의 index 함수를 호출하고 2. 호출한 결과를 브라우저에 반영하는 3. 흐름이다.

 

URL 분리

다음으로 넘어가기 전에 config/urls.py 파일을 조금 수정해야 한다. 왜냐하면 pybo 앱에 관련한 것들은 pybo 앱 디렉터리 하위에 위치해야 한다. 하지만 이대로라면 pybo와 관련된 URL을 추가할 때마다 config/urls.py 파일을 같이 수정해야 한다. config의 urls.py 파일은 앱의 성격이 아닌 프로젝트 성격의 파일이므로 이곳에는 프로젝트 성격의 URL 매핑만 추가되어야 한다. 그러므로 아래와 같이 조금의 수정 작업이 필요하다.

먼저 config/urls.py 파일을 다음처럼 수정하자.

- 파일이름: c:\projects\mysite\config\urls.py

from django.contrib import admin
from django.urls import path, include
from pybo import views  # 이제 필요없으니 삭제

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

pybo/ URL에 대한 매핑이 path('pybo/', views.index) 에서 path('pybo/', include('pybo.urls'))로 수정되었다.

path('pybo/', include('pybo.urls'))의 의미는 pybo/로 시작하는 페이지를 요청하면 이제 pybo/urls.py 파일의 매핑 정보를 읽어서 처리하라는 의미이다.  그래서 이제는 pybo/로 시작하는 URL을 추가해야 할 때 config/urls.py 파일을 수정할 필요없이 pybo/urls.py 파일만 수정하면 된다.

이제 pybo/urls.py 파일을 생성해야 한다. 파이참에서 pybo/urls.py 파일을 생성하기 위해 pybo → 마우스 오른쪽 클릭 → New → File클릭 후 파일명으로 urls.py를 입력하고 생성한다. 그리고 pybo/urls.py 파일의 내용은 다음과 같이 작성하자.

- 파일이름: C:\projects\mysite\pybo\urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index),
]

기존 config/urls.py 파일에 설정했던 내용과 별반 차이가 없다.

다만 path('', views.index) 처럼 pybo/ 가 생략되고 '' 이 사용되었다. 이렇게 되는 이유는 config/urls.py 파일에서 이미 pybo/로 시작하는 URL이 pybo/urls.py 파일과 먼저 매핑되었기 때문이다.

즉, /pybo URL은 다음처럼 config/urls.py 파일에 매핑된 pybo/ 와 pybo/urls.py 파일에 매핑된 '' 이 더해져 views.index 함수와 매핑된다.

만약 pybo/urls.py 파일에 path('/user',/sample ...)등의 URL매핑이 추가된다면 최종 매핑되는 URL은 pybo/가 더해진 pybo/user/, pybo/sample/등이 될 것이다.

이제 다시 http://localhost:8000/pybo 페이지를 요청해 보자. URL 분리 후에도 동일한 결과가 나타나는 것을 확인할 수 있을 것이다.

728x90
반응형

'혼자하는 프로젝트 > Django' 카테고리의 다른 글

Django 기본설정  (0) 2022.02.21
프로그래밍 이란?  (0) 2022.01.21