Web/Django

Django - URL과 뷰

괘창 2024. 5. 14. 20:49

● URL과 뷰

- 앱(App)

프로젝트 단독으로는 아무런 일도 할 수 없다.
프로젝트에 기능을 추가하기 위해서는 App 생성이 필요하다
명령 프롬프트에서 django-admin의 startapp 명령을 이용하여 pybo 앱 생성
(mysite) C:\projects\mysite> django-admin startapp pybo

 

** 명령 프롬포트에서 명령어 실행 시 파이참에 pybo 앱과 디렉토리 생성


1) urls.py

[파일이름: projects/mysite/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가 요청되면 views.index 호출
]

** pybo/ URL 요청 시 views.index 호출 매핑을 urlpatterns에 추가

** views.index는 views.py 파일의 index 함수를 의미한다.

** pybo/처럼 뒤에 슬래시(/)를 붙인 이유는 http://locahost:8000/pybo 입력 시 자동으로 뒤에 http://~8000/pybo/처럼 변환

 


2) views.py

[파일이름: projects/mysite/pybo/views.py]

 

from django.http import HttpResponse

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

** HttpResponse는 요청에 대한 응답을 할 때 사용

 

http://127.0.0.1:8000/pybo/ 페이지 접속 시 화면

 


- 장고 개발 흐름 정리하기

https://wikidocs.net/70649 참조

1. 브라우저에서 로컬 서버인 http://localhost:8000/pybo 에 페이지 요청

2. urls.py 파일에서 /pybo URL 매핑 확인 후 views.py 파일 index 함수 호출

3. 호출한 결과 브라우저에 반영


- URL 분리

pybo 앱에 관련한 것들은 pybo 앱 디렉토리 하위에 위치해야한다.

하지만 pybo와 관련된 URL 매핑을 추가할 때마다 config.urls.py 파일을 수정해야한다.

cofig의 ulrs.py 파일은 앱이 아닌 프로젝트 성격의 파일이므로 프로젝트 성격의 URL 매핑만 추가해야 한다.

 

[파일이름: projects/mysite/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')), #config에서 수정할 필요 없이 pybo/urls.py에서 작성한다는 의미
]

** path('pybo/', include('pybo.urls'))의 의미는 ?

pybo/로 시작하는 페이지를 요청하면  pybo/urls.py 파일의 매핑 정보를 읽어서 처리하라는 의미

 


[파일이름: projects/mysite/pybo/urls.py]

from django.urls import path
from . import views
urlpatterns = [
   path('', views.index),
]

** path('', views.index) 처럼 pybo/ 가 생략된 '' 이 사용된 이유는

config.urls.py 파일에서 pybo/로 시작하는 URL이 pybo/urls.py 파일과 먼저 매핑되었기 때문

이로인해 매핑된 '' 가 더해져 pybo/가 된다.

 

config/urls.py   pybo/urls.py   최종 URL
'pybo/' + '' = 'pybo/'
'pybo/' + 'question/create/' = 'pybo/qeustion/create/

 

http://localhost:8000/pybo

** URL 분리 후에도 동일한 결과값이 출력되는 것을 확인할 수 있다.