한 걸음씩
[Django] Django URLS 본문
1. 개요
► URL dispatcher
- dispatcher : 운항 관리자, 분배기
- URL 패턴을 정의하고 해당 패턴이 일치하는 요청을 처리할 view 함수를 연결(매핑)
2. 변수와 URL
► Variable Routing
- 템플릿의 많은 부분이 중복되고, URL 일부만 변경되는 상황인 경우
- URL 일부에 변수를 포함시키는 것
- 변수는 view 함수의 인자로 전달 할 수 있음
# Variable routing 작성법
<path_converter:variable_name>
<타입:변수 이름>
path('articles/<int:num>/', view.hello)
path('hello/<str:name>/', view.greeting)
► Path converters
- URl 변수의 타입을 지정
- str, int 등 5가지 타입 지원
- https://docs.djangoproject.com/ko/3.2/topics/http/urls/#path-converters
⎣ http://127.0.0.1:8000/url지정한 경로 명/정수, 문자(설정대로)/
3. APP의 URL
► App URL mapping
- 각 앱이 URL을 정의하는 것
- 프로젝트와 각각의 앱이 URL을 나누어 관리하여 주소 관리를 편하게 하기 위함
► include()
- 다른 URL들을 참조할 수 있도록 돕는 함수
- URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include된 URL로 전달
4. URL 이름 지정
- 기존 'articles/' 주소가 'articles/index/'로 변경됨
- 기존에 articles/ 주소를 사용했던 모든 위치를 찾아 변경해야 함
► Naming URL patterns
- URL에 이름을 지정하는 것
- path 함수의 name 인자를 정의해서 사용
⎣ 각 urls.py 파일 url 경로에 name을 붙여주기
⎣ URL 주소가 변경되어도 name으로 인해 절대경로가 만들어졌기 때문에 편리함
⎣ articles/urls.py 와 pages/urls.py의 name='index' 처럼 name이 겹치는 경우가 발생!!!
index 페이지를 연결해보면 마지막 index페이지 즉 pages의 index.html이 출력되고 articles의 index.html은 출력이 안됨
그래서 name에 app의 이름표를 붙여주면 해결됨 → 5.URL Namespace에서 설명
► 'url' tag
- 주어진 URL 패턴의 이름과 일치하는 절대 경로 주소를 반환
{% url 'url-name' arg1 arg2 %}
⎣ 'url' tag를 사용해서 절대 경로로 바꾸기
⎣ console.log 창에서 url 주소가 어떤 형식으로 출력되는 지 확인하기
5. URL Namespace
►app_name 속성 지정
- articles앱의 url 이름과 pages 앱의 url 이름이 같음
- 단순히 이름만으로는 분리가 어려운 상황
- app_name 속성 변경 하면 안됨
app_name = 'articles'
app_name = 'pages'
# 다만 app_name 속성을 지정한 순간 name만으로는 url을 연결할 수 없음 (NoReverseMatch 발생)
# 따라서 'app_name:name' 이런식으로 바꿔줘야함
⎣ app_name을 만들어주고 name만 지정해둔 url app_name 붙여서 변경하기
⎣ throw 링크를 클릭하면 아래와 같은 오류 발생
⎣ '나는 throw 페이지에 catch를 찾을 수 없어!!'
⎣ app_name, 즉 app이름표를 붙인순간 name만 사용할 수 없음
⎣ catch 앞에 app이름표를 붙여주면 오류 해결!
►NoReverseMatch
- 무조건 URL관련 문제
- URL 디버깅해보기
6. 참고
► app_name 지정 후 주의사항
- app_name을 지정한 이후에는 url 태그에서 반드시 app_name:url_name 형태로만 사용할 수 있음
- 그렇지 않으면 NoReverseMatch 에러가 발생
- 즉, app_name 지정 후 다음과 같은 표기는 사용 불가
{% url 'index' %} # NoReverseMatch 에러가 발생
► Trailing Slashes
- django는 url 끝에 '/' 가 없다면 자동으로 붙임
- django의 url 설계 철학
- 기술적인 측면에서 foo.com/bar와 foo.com/bar/는 서로 다른 URL이다
- 검색 엔진 로봇이나 웹 트래픽 분석 도구에서는 이 두 주소를 서로 다른 페이지로 봄
- 그래서 django는 검색 엔진이 혼동하지 않게 하기 위해 사용
- 그러나 모든 프레임워크가 이렇게 동작하는 것은 아님
'Django' 카테고리의 다른 글
[Django] OperationalError (0) | 2023.03.24 |
---|---|
[Django] Django Model (0) | 2023.03.24 |
[Django] 템플릿 경로 지정 BASE_DIR (0) | 2023.03.22 |
[Django] 로또 번호 생성 프로젝트 (0) | 2023.03.22 |
[Django] Django Template (0) | 2023.03.22 |