한 걸음씩

[Django] Django URLS 본문

Django

[Django] Django URLS

winter17 2023. 3. 23. 16:29

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

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는 검색 엔진이 혼동하지 않게 하기 위해 사용
  • 그러나 모든 프레임워크가 이렇게 동작하는 것은 아님

2023.03.22 - [Django] - [Django] 템플릿 경로 지정 BASE_DIR

'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