"3. 장고 url"의 두 판 사이의 차이
(→어떻게?) |
|||
(사용자 2명의 중간 판 4개는 보이지 않습니다) | |||
121번째 줄: | 121번째 줄: | ||
하나의 urls.py에 모든 주소를 관리하게 하는 건 양이 많아져 정리하기도 힘들다. 때문에 앱마다 URL을 알아서 관리하게끔 교통정리를 해주는 편이 좋다. 이 편이 정리하기에도, 확장하기에도 좋다. | 하나의 urls.py에 모든 주소를 관리하게 하는 건 양이 많아져 정리하기도 힘들다. 때문에 앱마다 URL을 알아서 관리하게끔 교통정리를 해주는 편이 좋다. 이 편이 정리하기에도, 확장하기에도 좋다. | ||
===config/urls.py 수정=== | ===config/urls.py 수정=== | ||
− | 앱으로 넘겨줄 url을 <code>path('앱이름/', include('앱이름.urls')),</code> 형태로 고치면 앱이름 주소와 매칭되는 모든 URL을 앱이름.urls로 넘긴다. [http://xn--hq1bm8jm9l/%EC%95%B1%EC%9D%B4%EB%A6%84/ http://도메인/앱이름/] 으로 시작되는 모든 주소를 앱의 urls.py로 넘겨준다는 의미이다.(#이후경로 매핑을 위해 주소 뒤에 /를 붙여준다.) | + | 앱으로 넘겨줄 url을 <code>path('앱이름/', include('앱이름.urls')),</code> 형태로 고치면 앱이름 주소와 매칭되는 모든 URL을 앱이름.urls로 넘긴다. [http://xn--hq1bm8jm9l/%EC%95%B1%EC%9D%B4%EB%A6%84/ http://도메인/앱이름/] 으로 시작되는 모든 주소를 앱의 urls.py로 넘겨준다는 의미이다.(#이후경로 매핑을 위해 주소 뒤에 /를 붙여준다.)<syntaxhighlight lang="python"> |
+ | from django.urls import path, include | ||
+ | from .views import * #해당 앱의 뷰를 불러온다. | ||
+ | |||
+ | urlpatterns = [ | ||
+ | path('주소/', 불러올파이썬파일.불러올함수, name='인덱스명'), # 함수를 불러올 때 ()는 제외한다. | ||
+ | path('주소/', include('앱이름.urls')), | ||
+ | past(.....) | ||
+ | .... | ||
+ | ] | ||
+ | </syntaxhighlight> | ||
===앱/urls.py 작성=== | ===앱/urls.py 작성=== | ||
− | /앱이름/urls.py 파일을 생성해두어야 한다. 다음과 같은 요소들이 최소요소. 여기서 작성된 url은 이전 주소 뒤에 붙는다.<syntaxhighlight lang=" | + | /앱이름/urls.py 파일을 생성해두어야 한다. 다음과 같은 요소들이 최소요소. 여기서 작성된 url은 이전 주소 뒤에 붙는다.<syntaxhighlight lang="python3"> |
− | from | + | from django.urls import path |
from .views import * #해당 앱의 뷰를 불러온다. | from .views import * #해당 앱의 뷰를 불러온다. | ||
131번째 줄: | 141번째 줄: | ||
urlpatterns = [ | urlpatterns = [ | ||
path('주소/', 불러올파이썬파일.불러올함수, name='인덱스명'), | path('주소/', 불러올파이썬파일.불러올함수, name='인덱스명'), | ||
− | + | path(.....) | |
.... | .... | ||
] | ] |
2022년 4월 29일 (금) 23:11 기준 최신판
1 개요[편집 | 원본 편집]
주소를 통해 웹사이트에 들어오게 된다. 이렇게 들어온 주소를 분석하여 특정한 페이지로 연결시켜주어야 한다. 이 연결의 첫번째 관문이 바로 \프로젝트\config\urls.py
이다.
setting.py의 ROOT_URLCONF 항목을 읽어 urls.py의 경로나 이름을 바꿀 수 있다.
1.1 역할[편집 | 원본 편집]
- 특수한 주소를 받으면, 그 주소에 해당하는 함수를 불러온다.(여기에 해당하는 view를 불러온다.)
- 매핑할 때 추출한 단어들을 뷰에 인자로 넘겨준다. 주소창 안의
~주소/<타입:변수명>
형태의 주소를 분석하여 뷰에 인자(타입:변수명)를 전달한다. - 매칭되는 뷰가 없다면 에러를 처리하는 뷰를 호출한다.
2 연결[편집 | 원본 편집]
path()함수와 re_path()함수 따위를 통해 URL과 함수(view)를 연결시킨다.
from django.urls import path
from . import 불러올파이썬파일 # 현재경로에서 불러온다는 의미.
urlpatterns = [
path('주소/', 뷰), # 해당 주소로 들어가면 뷰를 실행한다.(뷰는 위에서 import해와야 한다.)
path('', a) # http://도메인 으로 접속하면 a함수와 연결된다.
path('test/', test) # http://도메인/test/ 로 접속하면 test 함수와 연결된다.
past(.....)
....
]
2.1 path()[편집 | 원본 편집]
route, view 2개의 필수인자와 kwargs, name 2개의 선택인자를 받는다.
path(route, view, name='', kwargs)
path('주소/', 명령(일반적으로 함수를 불러온다), name="인덱스"),
형태로 쓰인다.
인자 | 설명 | 활용 및 설명 |
---|---|---|
route | URL패턴을 표현하는 문자열 | '주소/' 형태로 기입하면 http://서버주소/주소 URL에 대응된다.
항상 마지막엔 '/'를 더 붙여주는 편이 좋다.(이후 덧붙여질 주소를 위해) |
view | 매칭되면 호출되는 함수 | |
kwargs | URl에서 추출된 항목 외에 추가적인 인자를 전달할 때 파이썬 사전타입으로 인자를 정의한다. | |
name | 각 URL 패턴별로 이름을 붙여준다.(인덱스의 역할을 한다.) | 자세한 건 tip에서. |
2.2 최소요소[편집 | 원본 편집]
from django.urls import path
from . import 불러올파이썬파일 # 현재경로에서 불러온다는 의미.
urlpatterns = [
path('주소/', 뷰),
past(.....)
....
]
2.3 정규표현식의 사용[편집 | 원본 편집]
정규표현식을 사용해서 URL패턴을 작성할 수도 있다. (?P<year>[0-9]{4}) 형태로. 정규표현식에 익숙하지 않다면 힘들다;;
(정규표현식을 쓸 때엔 path()대신 re_path()함수를 사용한다.)
3 변수 전달하기[편집 | 원본 편집]
주소창에 정규표현식을 그대로 사용하긴 어려우니 다음과 같이 타입을 지정하여 내용을 view로 전달할 수 있다.
<변수타입:변수명> 형태로 path 함수에 넣으면 view에 그대로 전달해준다.
3.1 사용 가능한 타입[편집 | 원본 편집]
type | 설명 |
---|---|
str | /를 제외한 모든 문자열과 매칭됨.(디폴트타입) |
int | 음의 정수를 제외한 0과 양의 정수. 파이썬의 int타입으로 반환되어 view에 전달한다. |
slug | slug형식의 문자열.(아스키문자나 숫자, 하이픈, _를 포함한 슬러그 문자열과 매칭) |
uuid | UUID형식의 문자열. |
path | 기본적으로 str과 동일. /를 포함한 모든 문자열과 매치. /를 포함하여 주소지정을 할 때 사용. |
ex) path('origin_image/<int:image_id>/', views.show_origin_image, name='origin_image'),
- setting.py의 ROOT_URLCONF 항목을 읽어 urls.py를 불러오고, urlpatterns변수에 지정된 패턴을 찾아 대응시킨다.
3.2 전달예시[편집 | 원본 편집]
type | 설명 |
---|---|
str | path('str/<str:content>/', views.hello_content), |
int | path('int/<int:content>/', views.hello_content), |
slug | path('slug/<slug:content>/', views.hello_content), |
uuid | path('uuid/<uuid:content>/', views.hello_content), |
path | path('path/<path:content>/', views.hello_content), |
4 팁[편집 | 원본 편집]
4.1 URL분리[편집 | 원본 편집]
하나의 urls.py에 모든 주소를 관리하게 하는 건 양이 많아져 정리하기도 힘들다. 때문에 앱마다 URL을 알아서 관리하게끔 교통정리를 해주는 편이 좋다. 이 편이 정리하기에도, 확장하기에도 좋다.
4.1.1 config/urls.py 수정[편집 | 원본 편집]
앱으로 넘겨줄 url을 path('앱이름/', include('앱이름.urls')),
형태로 고치면 앱이름 주소와 매칭되는 모든 URL을 앱이름.urls로 넘긴다. http://도메인/앱이름/ 으로 시작되는 모든 주소를 앱의 urls.py로 넘겨준다는 의미이다.(#이후경로 매핑을 위해 주소 뒤에 /를 붙여준다.)
from django.urls import path, include
from .views import * #해당 앱의 뷰를 불러온다.
urlpatterns = [
path('주소/', 불러올파이썬파일.불러올함수, name='인덱스명'), # 함수를 불러올 때 ()는 제외한다.
path('주소/', include('앱이름.urls')),
past(.....)
....
]
4.1.2 앱/urls.py 작성[편집 | 원본 편집]
/앱이름/urls.py 파일을 생성해두어야 한다. 다음과 같은 요소들이 최소요소. 여기서 작성된 url은 이전 주소 뒤에 붙는다.
from django.urls import path
from .views import * #해당 앱의 뷰를 불러온다.
app_name = '앱이름' #이름공간을 위한, 인덱싱을 위한 변수이다. 이걸 작성하면 인덱스는 '앱이름:인덱스'로 바뀐다.
urlpatterns = [
path('주소/', 불러올파이썬파일.불러올함수, name='인덱스명'),
path(.....)
....
]
4.2 URL 별칭 설정하기[편집 | 원본 편집]
종종 URL 형태를 바꾸어주어야 할 때가 있는데, url의 형태를 바꾸면 view, tempalte 등에서 일일이 다 바꾸어 주어야 한다. 그러나, 별칭을 지정해둔다면 장고가 알아서 별칭에 해당하는 주소를 찾아준다.
나중에 url 규칙이 변경되더라도 인덱스를 사용하여 그대로 쓸 수 있게끔. 주소패턴에 인덱싱하는 거라 보면 편하다.
4.2.1 방법[편집 | 원본 편집]
name 속성을 지정해주면 된다.
앱URL을 따로 구분한 경우, 인덱싱은 앱이름:인덱스
형태로 접근하게 된다.
4.2.2 기대효과[편집 | 원본 편집]
인덱스를 지정해 두면 템플릿에선 <a href="{% url '앱이름:인덱스' 전달할변수 %}"> 형태로 쓸 수 있음.
이 별칭은 view에서도 render, redirect 등에서 redirect('인덱스', 전달할변수) 형태로 사용된다.