Django - URL과 뷰
● 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/ 페이지 접속 시 화면

- 장고 개발 흐름 정리하기

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 분리 후에도 동일한 결과값이 출력되는 것을 확인할 수 있다.