[Django] 장고의 기본 요소 익히기 - URL과 뷰

싱숭생숭어·2023년 4월 28일
0

Django

목록 보기
5/19
post-thumbnail

위 글은 점프 투 장고를 참고해 작성하였습니다.

앱(App)

앞선 1장에서 장고의 기본인 프로젝트(Mysite)를 생성하였다. 하지만 프로젝트는 단독으로는 사용할 수 없고, 프로젝트의 기능인 앱(App)을 생성해야한다.

게시판 기능을 담당할 pybo라는 앱을 생성해 볼 것이다.

mysite안 명령 프롬포트에서 django-admin startapp pybo를 입력한다.

(mysite) gyu@DESKTOP-4OUGKIK:~/workspace/projects/mysite$ django-admin startapp pybo
(mysite) gyu@DESKTOP-4OUGKIK:~/workspace/projects/mysite$ 

명령 프롬포트 상에서는 변화가 없지만, pybo의 앱과 디렉토리가 생성되었음을 볼 수 있다.


Hello pybo

브라우저에서 http://localhost:8000/pybo 페이지를 요청했을 때 "안녕하세요 pybo에 오신것을 환영합니다."라는 문자열을 출력하도록 만들어 볼 것이다.

위에서 pybo라는 앱만 생성하고 python manage.py runserver를 통해 개발 서버의 pybo페이지를 구동하면,

위와 같이 404 에러가 발생한다.

404 오류는 브라우저가 요청한 페이지를 찾을 수 없을 경우에 발생한다.

오류의 내용을 자세히 읽어보면 config/urls.py파일에 요청한 pybo/ URL에 해당되는 매핑이 없다고 적혀 있다.
-> config/urls.py 파일에 pybo/ URL에 대한 매핑을 추가해야함

urls.py 파일: 페이지 요청이 발생하면 가장 먼저 호출되는 파일로, URL과 뷰 함수 간의 매핑을 정의
뷰 함수: views.py 파일에 정의된 함수를 말한다.

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),
]

config/urls.py 파일을 위와 같이 수정한다.

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

  • 여기서 실제 URL은 pybo앞에 localhost:8000/이 붙지만 이는 실행환경에 의해 달라지는 값이므로 pybo만 지정해주면 되는 것 !

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

views.py

위의 URL 매핑 시 활용한 view.index를 추가해주어야 한다.

from django.http import HttpResponse


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

pybo/views.py 파일을 위와 같이 수정한다.

  • HttpResponse는 요청에 대한 응답을 할때 사용
    -> 여기서는 "안녕하세요 pybo에 오신것을 환영합니다." 라는 문자열을 브라우저에 출력하기 위해 사용

  • index 함수의 매개변수 request는 HTTP 요청 객체
    -> request 객체에 대해서는 뒤에서 자세히 ..

이후 다시 python manage.py runserver 입력 시 장고 개발 서버가 제대로 실행되는 것을 볼 수 있다 !

장고 개발 흐름 정리하기

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


urls.py 분리

pybo 앱에 관련한 것들은 pybo 앱 디렉터리 하위에 위치해야 한다. 하지만 위의 방식에서 pybo와 관련된 URL 매핑을 추가할 때마다 config/urls.py 파일을 수정해야 한다. configurls.py 파일은 앱이 아닌 프로젝트 성격의 파일이므로 이곳에는 프로젝트 성격의 URL 매핑만 추가되어야 한다. 따라서 pybo 앱에서만 사용하는 URL 매핑을 config/urls.py 파일에 계속 추가하는 것은 좋은 방법이 아니다.

먼저 ,config/urls.py 파일을 다음과 같이 수정한다.

from django.contrib import admin
from django.urls import path, include

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/question/create, pybo/answer/create 등의 pybo/로 시작하는 URL을 추가해야 할 때 config/urls.py 파일을 수정할 필요없이 pybo/urls.py 파일만 수정하면 된다.

그렇다면 이제 pybo/urls.py 파일을 생성해야 한다. VSCODE에서 pybo/urls.py 파일을 생성하기 위해 [pybo → 마우스 오른쪽 클릭 → New → File]을 한 다음 파일명으로 urls.py를 입력하자.

pybo/urls.py 파일 내용은 아래와 같이 한다.

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index),
]
  • 기존 config/urls.py 파일에 설정했던 내용과 별반 차이 X(위의 urls.py 부분 참고)

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

  • 즉, pybo/ URL은 다음처럼 config/urls.py 파일에 매핑된 pybo/pybo/urls.py 파일에 매핑된 '' 이 더해져 pybo/가 됨.

  • config/urls.pypybo/urls.py최종 URL
    pybo/+''=pybo/
    pybo/+question/create/=pybo/question/create/
  • 위의 두번째 예시처럼 pybo/urls.py 파일에 path('question/create/', ...) 라는 URL매핑이 추가된다면 최종 매핑되는 URL은 pybo/가 더해진 pybo/question/create/가 될 것 !!

이제 다시 http://localhost:8000/pybo 페이지를 구동시키면, URL 분리 후에도 동일한 결과가 나타나는 것을 확인 가능 !!!

profile
공부합시당

0개의 댓글