컴퓨터/WEB

[Django] 장고에서 URL 작성하는 방법과 URL 처리

정석이 2022. 4. 27. 21:20

 

URL 작성

디장고를 사용하면 많은 URL을 작성하게 될 것이다.

 

Django가 가지고 있는 철학 중 하나가 바로 'URL은 반드시 아름답게 작성되어야 한다'는 것인데,  막상 작성하다보면 헷갈릴 수 있는 부분들이 있다. 

 

 

 

 

첫째. urls.py에 적는 URL 패턴은 슬래시( / )를 붙여서 작성한다.

urlpatterns=[
    path('food/', views.index),
    path('food/apple/', views.fruit),
]

 

URL 끝에 있는 슬래시를 트레일링 슬래시(traling slash)라고 하는데, 우리가 평소에 구글에 접속하고자 할 때를 생각해보면 www.google.com 이라고 적는다. 그런데 www.google.com/ 이라고 적어도 같은 페이지로 이동하긴 한다.

 

결론부터 말하면 tistory.com 이나 google.com 같이 도메인 끝에 나오는 슬래시는 그 유무에 따른 차이가 없다.

 

하지만 도메인이 아닌 다른 url, 그러니까 ticssfm.tistory.com/155?category=1007516 같은 url에 대해서는 슬래시가 붙은 주소와 아닌 주소가 서로 다른 곳을 가리키는 주소가 된다.

 

위에 예시로 적은 코드로 말하면 'food/' 와 'food'가 서로 다르다는 말이다.

 

예전에는 슬래시가 붙은 주소는 '디렉토리'를 가리키고 슬래시가 없는 주소는 '파일'을 가리켰다.

 

그런데 오늘날에는 URL이 직접적으로 파일이나 디렉토리를 가리키지 않고 대부분의 데이터는 데이터베이스에 저장해서 사용한다.

 

암튼 웹 사이트를 개발하는 입장에서는 슬래시 유무를 하나의 형식으로 맞춰줘야한다.

 

그래서 Django는 기본적으로 트레일링 슬래시가 붙어 있지 않은 URL로 요청이 들어오면  먼저 해당 URL와 딱 맞는 URL 패턴이 있는지를 보고, 만약 없다면 슬래시를 붙인 URL로 다시 리디렉션 하는 설정이 기본적으로 되어 있다.

 

그래서 우리가 URL 패턴을 작성할 때 트레일링 슬래시가 붙어있는 형태로 작성하는 것이 일정한 형식을 유지하는 측면에서 더 좋다.

 

그러면 슬래시가 안붙은 URL로 요청이 들어오더라도 자동으로 슬래시가 붙은 URL로 연결되기 때문이다.

 

 

 

 

둘째. 다른 URL로 이동하기 위한 URL을 적을 때 앞에 슬래시(/)가 있으면 도메인으로 부터의 경로를 의미한다.

 

예를 들어, 현재 tistory.com/food/ 에 있다고 하고 아래의 이동하기 링크를 누르면

<a href="/apple/">이동하기</a>

 

tistory.com/food/apple/가 아닌 tistory.com/apple/로 이동하게 된다.

 

 

 

 

셋째. 다른 URL로 이동하기 위한 URL을 적을 때, 앞에 슬래시(/)가 없으면 현재 URL 뒤에 이동하는 URL이 연결된 경로가 된다.

 

예를 들어, 현재 tistory.com/food/ 에 있다고 하고 아래의 이동하기 링크를 누르면

<a href="apple/">이동하기</a>

 

tistory.com/food/apple/ 로 이동하게 된다.

 

 

 

 


 

Django의 URL 처리

Django의 URL 처리 방식은 직관적이고 자주 변경되지 않는 구조로 되어 있다.

 

URLconf (urls.py)

Django에서 URL을 처리하기 위해서는 URLconf 모듈 즉 urls.py를 작성해야 한다.

 

URLconf 예시

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('URL', views.view)
]

 

URL 처리 순서

 

  1. 처음 요청이 들어오면 Django는 맨 처음 사용할 URLConf 모듈을 찾음. 따로 변경하지 않았다면 프로젝트 앱 내 settings.py의 ROOT_URLCONF 설정을 사용한다.
  2. ROOT_URLconf로 정의된 URLConf 모듈을 보고 urlpatterns 리스트 안쪽의 django.urls.path() 함수를 순서대로 실행한다.
  3. 요청과 일치하는 URL 패턴이 있다면 django.urls.path() 함수에 따라 view를 호출하거나, 일치하는 URL 패턴 다음의 URL을 하위 URLconf 모듈로 넘긴다.

 

from django.urls import path
from django.urls import include
from . import views

urlpatterns = [
    path('music/', views.player),
    path('video/', include('videoApp.urls')),
    # URL이 '~/video/lecture/django' 라면
    # videoApp의 URLconf에는 'lecture/django'가 넘어갑니다.
]

 

 

Path 함수 알아보기

 

path 함수는 다음과 같이 정의되어 있고 총 4개의 인자를 갖는다.

django.urls.path

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

 

route

URL 문자열을 인수로 받으며 경로 변수(Path Converter)를 사용하여 URL의 일부를 view의 인수로 보낼 수 있다.

 

 

 

Path converters

Django에서 기본으로 제공하는 경로 변환기 이하 경로 변수는 5가지가 있다.

  • str : 경로 구분 기호(/)를 제외한 모든 문자열과 매칭됨
  • int : 0 또는 양의 정수와 매칭됨
  • slug : 문자, 숫자, 하이픈(-), 밑줄(_)로 구성된 문자열과 매칭됨
  • uuid : 범용 고유 식별자(UUID)와 매칭됨
  • path : 경로 구분 기호(/)를 포함한 모든 문자열과 매칭됨

 

view

함수형 view 또는 클래스 기반 view가 들어갈 수 있고 우리가 위에서 적어준 것처럼 include를 사용해서 다른 URLconf 모듈로 연결할 수도 있다.

 

 

kwargs

view에 추가 인자를 전달 할 때 사용

 

 

name

path 함수가 가지는 URL 패턴에 이름을 붙여 주기 위해 사용하는데 URL을 직접 템플릿에 적지 않게 해주고 URL을 직관적으로 참조할 수 있게 해줌