클라이언트로부터 온 HTTP 요청을 장고가 받으면, 이를 기반으로 HttpRequest 객체를 생성한다.
이 객체는 뷰에 인수로 전달되며, 필요한 정보를 추출하여 사용할 수 있다.
request.method
: 현재 요청의 HTTP 메서드를 담고 있음request.GET
: URL의 쿼리 스트링에 있는 모든 변수를 담고 있는 딕셔너리request.POST
: HTTP POST 메서드를 통해 전송된 모든 변수를 담고 있는 딕셔너리request.FILES
: 파일 업로드에 사용. 사용자가 파일을 업로드하면 이 딕셔너리에 저장request.COOKIES
: 클라이언트 측 쿠키에 저장된 모든 변수를 담고 있는 딕셔너리request.user
: 현재 세션의 사용자 인스턴스request.session
: 현재 세션에 대한 딕셔너리와 유사한 객체Django의 템플릿 태그는 뷰에서 HTML로 데이터를 전달하는 방법을 제공한다. 이를 통해 HTML에서 파이썬 코드를 안전하게 실행할 수 있다.
메인 앱의 urls.py
의 모습이다.
# main > urls.py
from django.urls import path
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
print("index호출")
print(f"request: {request}")
print(f"request: {dir(request)}")
print(f"request.GET: {request.GET}")
print(f'request.GET.get("q"): {request.GET.get("q")}')
print(f'request.GET.get("test"): {request.GET.get("test")}')
return HttpResponse("Hello, world!")
python manage.py runser
로 서버를 열면
라는 글씨가 출력된다. 콘솔창 출력은 다음과 같다.
print(f"request.GET: {request.GET}")
: 클라이언트가 GET
방식으로 전송한 데이터를 담고 있다. 딕셔너리 형태print(f'request.GET.get("q")
: GET
의 딕셔너리에서 q
라는 키에 해당하는 값을 출력. q
의 값이 없으면 None
q
란 http://127.0.0.1:8000/?q=hello
와 같은 형식에서 ?q=hello
부분을 말한다.&
기호로 구분된다.웹 상의 URL에서 http://127.0.0.1:8000/?q=hello
라고 GET
요청을 하면 다음과 같다.
def template_tag(request):
mock_data = [
{
"_id": "40ed5f5d-1479-4cff-A8db-50cd925358d1",
"index": "1",
"name": "탁민재",
"email": "user-okckofi@molestie.net",
"phone": "010-3275-8617",
"country": "감비아",
"address": "용두동 86-3",
"job": "메이크업아티스트",
"age": "29",
},
{
"_id": "c802171f-5661-43d8-C146-29d60cb097ab",
"index": "2",
"name": "류정민",
"email": "user-98i0esc@Ornare.com",
"phone": "010-7740-8505",
"country": "칠레",
"address": "성동로 89-4",
"job": "메이크업아티스트",
"age": "61",
},
{
"_id": "8f605ef8-98fe-43ab-A234-e7882745254e",
"index": "3",
"name": "대재은",
"email": "user-rj5sqf1@finibus.com",
"phone": "010-2930-6436",
"country": "가나",
"address": "공덕로 9-3",
"job": "은행출납사무원",
"age": "30",
},
{
"_id": "63d288ca-81ee-4689-Af9d-e3d20e8a8b2e",
"index": "4",
"name": "등예건",
"email": "user-0crjbbk@montes.io",
"phone": "010-6523-7033",
"country": "세인트루시아",
"address": "행운동 87-5",
"job": "국제회의전문가",
"age": "57",
},
{
"_id": "acb7bc4b-b99e-4cff-Cd1f-ce14b4572773",
"index": "5",
"name": "담누리",
"email": "user-ay8ycrv@Nam.co.kr",
"phone": "010-6276-4787",
"country": "수리남",
"address": "잠원로 25-9",
"job": "영화감독",
"age": "47",
},
{
"_id": "488f4267-3f06-432f-B3bd-7f9f5f793a5e",
"index": "6",
"name": "동진성",
"email": "user-k285yz7@sagittis.biz",
"phone": "010-4826-4141",
"country": "그레나다",
"address": "서소문로 76-7",
"job": "심리학연구원",
"age": "53",
},
{
"_id": "ba473db8-1d12-4241-Ce5c-66348452eec9",
"index": "7",
"name": "근승리",
"email": "user-a1txn3z@tempus.io",
"phone": "010-2148-4195",
"country": "앤티가 바부다",
"address": "대림로 35-6",
"job": "로봇연구원",
"age": "20",
"contents": "각급 선거관리위원회의 조직·직무범위 기타 필요한 사항은 법률로 정한다. 국가는 법률이 정하는 바에 의하여 재외국민을 보호할 의무를 진다. 국회의원의 수는 법률로 정하되, 200인 이상으로 한다.\n\n\n대통령이 임시회의 집회를 요구할 때에는 기간과 집회요구의 이유를 명시하여야 한다. 이 헌법공포 당시의 국회의원의 임기는 제1항에 의한 국회의 최초의 집회일 전일까지로 한다.",
},
]
context = {"mock_data": mock_data}
return render(request, "template_tag.html", context)
urlpatterns = [
path("", index),
path("template/", template_tag),
]
json 형식의 mock_data를 정의해주었고, template_tag
라는 HTML 파일에 context
데이터를 넘겨주어 해당 템플릿 내에서 데이터를 활용할 것임을 암시하고 있다.
urlpatterns
는 해당 경로의 URL로 들어가면 적절한 뷰 함수로 웹 요청에 대한 응답을 반환한다는 이야기이다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
</head>
<body>
{% for i in mock_data %}
<section>
<h2>{{ i.name }}</h2>
<p>{{ i.email }}</p>
<!-- 개행이 안되어 있는 것을 확인! -->
<p>{{ i.contents }}</p>
<!-- 개행이 된 것을 확인! -->
<p>{{i.contents|linebreaks }}</p>
<hr>
<p>{{ i.contents|truncatewords:5 }}</p>
<p>{{ i.contents|length }}
<p>{{ i.contents|slice:":10" }}
<hr>
<p>{{ forloop.counter }}번째 반복문</p>
<p>{{ forloop.counter0 }}</p>
<p>{{ forloop.revcounter }}</p>
</section>
{% endfor %}
{% for i in mock_data %}
<h2>{{i.name}}</h2>
<p>{{ forloop.counter }}</p>
<p>{{ i.age }}</p>
{% if i.age|add:"0" >= 20 and i.age|add:"0" <= 35 %}
<p>청년입니다.</p>
{% elif i.age|add:"0" >= 35 and i.age|add:"0" <= 60 %}
<p>중년입니다.</p>
{% else %}
<p>장년입니다.</p>
{% endif %}
{% endfor %}
{% with value='hello world' %}
<p>{{value}}</p>
<p>이 안에서 for나 if를 사용할 수 있습니다.</p>
{% endwith %}
{% lorem 3 p %}
It is {% now "jS F Y H:i" %}
</body>
</html>
urls.py
의 mock_data
를 활용하고 있다.
<p>{{ i.contents }}</p>
contents
라는 키의 값을 반환하며 값이 없으면 0을 출력한다.
<p>{{i.contents|linebreaks }}</p>
contents
값이 없으면 위의 contents
와 중복되어 출력하지 않고 1번만 0을 출력한다. 만약, 값이 있다면 \n
개행 문자를 <br
태그(줄바꿈)으로 변환하여 출력한다.
줄바꿈이 제대로 되는 모습을 보여준다.
{{ i.contents|truncatewords:5 }}
contents
의 문자열을 처음 5단어만 출력하고, 나머지는 생략한다.
{{ i.contents|length }}
contents
문자열의 길이를 출력한다.
{{ i.contents|slice:":10" }}
contents
문자열의 처음 10글자만 출력한다.
{{ forloop.counter }}
현재 반복문의 반복 횟수를 출력한다. counter
는 1부터 시작하며, counter0
는 0부터 시작한다.
{% if i.age|add:"0" >= 20 and i.age|add:"0" <= 35 %}
조건문을 활용하여 나이에 따른 분류를 출력한다.
{% with value='hello world' %}와 {% endwith %} 사이의 코드
value
라는 변수를 hello world
라는 값으로 할당하고, 이를 사용하여 출력한다.
{% lorem 3 p %}
It is {% now "jS F Y H:i" %}