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 처리 순서
- 처음 요청이 들어오면 Django는 맨 처음 사용할 URLConf 모듈을 찾음. 따로 변경하지 않았다면 프로젝트 앱 내 settings.py의 ROOT_URLCONF 설정을 사용한다.
- ROOT_URLconf로 정의된 URLConf 모듈을 보고 urlpatterns 리스트 안쪽의 django.urls.path() 함수를 순서대로 실행한다.
- 요청과 일치하는 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을 직관적으로 참조할 수 있게 해줌
'컴퓨터 > WEB' 카테고리의 다른 글
[Django] PythonAnywhere로 Django 프로젝트 배포하기 (0) | 2022.05.01 |
---|---|
[Django] Django의 Migration (0) | 2022.04.30 |
[Django] Template Language (0) | 2022.04.28 |
[Django] django의 MVT 구조 (0) | 2022.04.28 |
[Django] 디장고 디렉터리 구조 살펴보기 (0) | 2022.04.27 |