Django(장고) urls.py

장현웅·2023년 9월 3일
0

Django 작동 방식(MVT 패턴)

URLconf


클라이언트의 요청이 어떻게 이루어졌는지 분석하는 단계로 클라이언트와 서버가 소통하기 위해 어떤 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만으로는 모르겠는데.....
  • 'index'가 'index.html'파일을 나타내는 경우, 웹 서버에게 'index.html'파일을 요청하면 되고,
  • 'index'가 DB에서 추출한 특정 정보를 나타내는 경우, 웹 어플리케이션에서 데이터를 가공하고 클라이언트한테 반환하면 되고,
  • 'index'가 웹 어플리케이션의 라우터(데이터의 네비게이션)나 컨트롤러(어플리케이션의 동작(로직) 제어)에서 특정 페이지를 가리키는 경우, 해당 페이지를 렌더링해서 클라이언트에게 제공하면 되는데...

이런 분석을 urls.py파일에서 한다.

urls.py


사용자로부터 들어온 요청 url을 어느 url로 연결할건지 즉, 어떤 화면으로 연결할건지 정의하는 곳

URL 경로와 뷰 함수 간의 매핑을 정의한다.

이 파일을 사용하여 클라이언트의 요청 URL을 분석하여, URL패턴을 정의하고, 해당 요청 URL 패턴을 어떤 View 함수와 연결할지(라우팅) 결정한다.

  • view함수의 인자 'request'

    Django에서 제공하는 'HttpRequest' 클래스의 객체로 많은 정보가 들어있다.

  • path(route, view, kwargs=None, name=None, Patterns=None)

    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 패턴(경로)를 빈 상태로 두어야 한다.

0개의 댓글