Django 작동 방식(MVT 패턴)
클라이언트의 요청이 어떻게 이루어졌는지 분석하는 단계로 클라이언트와 서버가 소통하기 위해 어떤 HTTP 요청 방식과 어떤 도메인 주소를 사용했는지 분석한다.
클라이언트가 다음과 같이 URL을 요청해온다.
GET http://127.0.0.1:8000/index
여기서
GET
은 HTTP 프로토콜을 사용하는 웹 요청에서 사용되는 HTTP Method 중 하나이다.
Get
Method는 서버에서 리소스를 검색하거나 요청된'Resource'
에 대한 정보를 요청하는데 사용된다. 클라이언트가 서버에게GET
요청을 보내면 서버는 요청된'Resource'
를 반환한다.웹에서
'Resource'
란 다양한 종류의 데이터 또는 정보를 말한다. HTML 문서, 이미지 파일, CSS, JavaScript파일, 데이터 파일, 다른 오디오 및 비디오 파일, PDF문서 등 웹 서버는 웹 어플리케이션 서버와의 통신을 관리하면서 이런 정적인 콘텐츠를 제공한다.
'http'
는 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위해 사용되는 통신 규약이다.
'/'
는 구분자이다.
'127.0.0.1'
은 서버의 IP 주소를 나타낸다. 이 경우 로컬 호스트 즉, 클라이언트를 가리킨다.
'8000'
은 서버가 수시나는 포트 번호를 나타낸다.
'/index'
는 서버에서 요청된'Resource'
의 경로를 나타낸다. 이 경우, 'index'페이지를 요청한 것이다.따라서, "GET http://127.0.0.1:8000/index" 요청은 클라이언트가 로컬 호스트의 8000번 포트로 HTTP GET 메서드를 사용하여 "/index" 페이지를 요청하는 것을 의미한다.
웹 서버는 이 요청을 받아들여 해당 경로에 있는 "index" 페이지를 반환하거나 처리할 것이다.
위의 요청은 이렇게 분석할 수 있다.
GET
이라는 HTTP Method를 받았으니, 클라이언트가 원하는 정보가 있다.'Resource'
가 'index'인데 어떤 종류의 'Resource'
를 원하는거지?URL
만으로는 모르겠는데.....이런 분석을 urls.py
파일에서 한다.
사용자로부터 들어온 요청 url을 어느 url로 연결할건지 즉, 어떤 화면으로 연결할건지 정의하는 곳
URL 경로와 뷰 함수 간의 매핑을 정의한다.
이 파일을 사용하여 클라이언트의 요청 URL을 분석하여, URL패턴을 정의하고, 해당 요청 URL 패턴을 어떤 View 함수와 연결할지(라우팅) 결정한다.
Django에서 제공하는 'HttpRequest' 클래스의 객체로 많은 정보가 들어있다.
URL 패턴과 View 함수를 매핑(Mapping : 하나의 값을 다른 값으로 대응시킴)하는데 사용되는 함수.
route : URL 패턴을 가진 문자열로 클라이언트의 요청 URL과 비교
view : 클라이언트가 요청한 URL이 path함수에 정의된 URL 패턴과 일치하면, 해당 패턴에 연결된 View함수 또는 클래스가 호출
kwargs : 임의의 키워드 인수들을 목표한 view에 사전형으로 전달
name : URL에 이름을 지으면, 템플릿을 포함한 Django 어디에서나 명확하게 참조가 가능
[view 형태에 따른 urls.py 메뉴얼]
- 함수
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
- 클래스
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
- 일치하는 URL 패턴이 다른 App의 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')
Django 프로젝트의 main 디렉토리의 urls.py
파일의 구조는 다음과 같다.
[기본 형태]
from django.contrib import admin
from django.urls import path, include
from . import views # view함수를 views.py에 따로 두었기 때문에 임포트해와야 연결이 된다.
# .은 현재 디렉토리
urlpatterns = [
path('admin/', admin.site.urls),
path('경로', views.함수나 클래스 이름()),
]
'경로'
에 해당하는 주소로 클라이언트가 요청을 한 경우, views파일의 함수나 클래스 이름()
중 요청 받은 HTTP Method와 같은 모듈이 있는지 확인해준다.
[Main Directory's urls.py]
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test/', views.base_response, name='first_test'),
path('first/', views.first_view, name='first_view'),
path('',include('user.urls')),
]
Django에서 다른 앱의 urls.py 파일을 임포트할 때, path('',include('user.urls'))
에 빈 '경로'
를 사용하는 이유는 URL 합성을 위한 것이다.
Django 어플리케이션은 여러 개의 앱으로 구성될 수 있고, 각 앱은 자체적으로 URL 패턴을 가지고 있다.
path('',include('user.urls'))
은 'user'
앱의 URL패턴을 현재 URL패턴에 합성한다는 의미이다.
[App's urls.py]
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
]
만약 path('member/',include('user.urls'))
와 같이 정의되었다면 'user'
앱의 URL 패턴인 'sign-up/'
과 'sign-in/'
(회원가입 페이지와 로그인 페이지) URL 패턴은 'member/'
(회원) URL의 하위 경로에서만 처리된다.
클라이언트가 회원가입 페이지와 로그인 페이지를 접속하려면
GET http://127.0.0.1:8000/member/sign-up/
GET http://127.0.0.1:8000/member/sign-in/
으로 요청해야하는 것이다.
GET http://127.0.0.1:8000/sign-up/
으로 접속하게 하려면 다른 앱의 urls.py
를 임포트할 때 path함수의 url 패턴(경로)를 빈 상태로 두어야 한다.