요청과 응답
- 장고는 URL → VIEW → TEMPLATE 순으로 요청이 이루어지고 역순으로 데이터가 반환됨
- 개발 과정 또한 urls.py → views.py → templates 순으로 진행
urls.py
- 페이지 요청이 발생하면 가장 먼저 호출되는 파일로, URL과 VIEW 함수 간의 매핑을 정의함. (여기서 VIEW 함수는
views.py
파일에 정의된 함수를 지칭)from django.contrib import admin
from django.urls import path
***from myapps import views***
**urlpatterns** = [
path('admin/', admin.site.urls),
path('myapps/', views.index),
]
myapps/
URL이 요청될 경우 views.index
를 호출하라는 매핑을 urlpatterns에 추가
- 여기서
views.index
는 views.py 파일의 index함수를 의미
views.py
- HTTP 요청을 수신하고 HTTP 응답을 반환하는 함수 작성.
- Template에게 HTTP 응답 서식을 맡김
from django.http import HttpResponse
def index(request):
return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")
- render()
from django.shortcuts import render
def index(request):
return render(request, template_name, context)
- httpResponse 객체를 반환하는 함수로, 템플릿을 context와 엮어 httpResponse로 쉽게 반환하도록 하는 함수
- request : 응답을 생성하는 데 사용되는 요청 객체 (필수)
- template_name : 템플릿의 전체 이름 또는 템플릿 이름의 경로 (필수)
- context : 템플릿에서 사용할 데이터(딕셔너리 타입으로 작성) (선택)
URL 분리
App URL mapping
- 각 앱의 view 함수를 다른 이름으로 import 할 수 있음
- 하나의 프로젝트에 여러 앱이 존재할 경우, 각각의 앱 안에 urls.py를 만들고 프로젝트 urls.py에서 각 앱의 urls.py로 URL 매핑을 위탁할 수 있음
- urlpattern은 언제든지 다른 URLconf모듈을 포함(include)할 수 있음
- include되는 앱의 urls.py에
urlpatterns
가 작성되어 있지 않다면 에러 발생
include()
- 다른 URLconf(app1/urls.py)들을 참조할 수 있도록 돕는 함수
- 함수 include()를 만나게 되면 URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리하기 위해 include된 URLconf로 전달
URL patterns
- 링크에 URL을 직접 작성하는 것이 아닌, path() 함수의 name인자를 정의해서 사용
- DTL의 Tag 중 하나인 URL 태그를 사용하여 view 함수와 템플릿에서 특정 주소를 쉽게 참조 가능
{% url ' ' %}
- 주어진 URL 패턴 이름 및 선택적 매개 변수와 일치하는 절대 경로 주소를 반환
urlpatterns = [
path('index/', views.index, name='index'),
path('pages/', views.pages, name='pages'),
]
<form action="{% url 'index' %}" method="GET">
<label for="message">Order</label>
<input type="text" name="message" id="message">
<input type="submit">
</form>
URL namespace
- 프로젝트의 규모가 커지고 앱이 많아짐에 따라 URL 이름이 중복되어 클릭시 원하는 페이지로 이동하지 않는 경우 발생
- URL namespace(이름 공간)를 사용하면 서로 다른 앱에서 동일한 URL 이름을 사용하는 경우에도 이름이 지정된 URL을 고유하게 사용할 수 있음
{% url ‘*<app name>*:index’ %}
- 단 app_name을 지정한 이후에는 url 태그에서 app_name:url_name 형태로만 사용해야 함
app_name = 'articles'
urlpatterns = [
path('index/', views.index, name='index'),
]
<form action="{% url 'articles:index' %}" method="GET">
...
Template namespace
Query String Parameters
- 사용자가 입력 데이터를 전달하는 방법 중 하나로, URL 주소에 데이터를 파라미터를 통해 넘기는 것
- 이러한 문자열은 앰퍼샌드(&)로 연결된 key=value 쌍으로 구성되며 기본 URL과 물음표(?)로 구분됨
Trailing Slashes
- Django는 URL 끝에 ‘/’가 없다면 자동으로 붙여주는 것이 기본 설정
- 기술적인 측면에서 foo.com/bar와 foo.com/bar/는 서로 다른 URL임
- Django는 URL 정규화를 통해 복수의 페이지에서 같은 콘텐츠가 존재하는 것을 방지
- URL 정규화는 검색엔진 최적화에도 도움됨
Variable routing
예제로 배우는 파이썬 프로그래밍 - URL 매핑