본 내용은 해당 강의 내용을 참조하여 만들었음을 밝힙니다.
What are "URLs" (or "Routes")?
어떤 url을 만들건지 고려해야 한다.
다양한 url을 가지고 있고 각기 다른 응답을 가진다.
What are Views?
The logic that is executed for different URLs (and Http methods)
장고 프로젝트에서 뷰는 가장 간단하게 function이라고 생각하면 된다.
특정한 url이 장고 서버에 전달이 되었을 때 작동하는 function.
또한 class가 될 수도 있다.
function & Class -> Code that handles (evaluates) requests and returns reponses
* Load & Prepare data
* Run any other business logic
* Prepare and return response data (e.g. HTML)
URL와 view는 긴밀하게 동작한다.
URLs & Views
Views are responsible for processing requests (parsing the URL, Http method and potential request data) and creating a response.



두 개의 서로 다른 앱이 있는 것
Request/ Response Flow
Client - Request -> Server (Django) -> URLconf -> view, view, view, -> Response -> Client


placeholder segment
Redirects
Redirect란, 사용자를 다른 페이지로 자동으로 보내주는 것이다.
웹 브라우저에서 어떤 URL로 요청했는데, 다른 URL로 이동시키는 동작을 말한다.

숫자를 치면 자동으로 url에서 문자로 바꾸고 이에 대한 값으로 할당해서 넘겨줌

입력받은 숫자가 12보다 크면 에러 메세지 출력
리스트안에 12개가 들어있으므로..
Django에서 Redirect 하는 방법
1. HttpResponseRedirect("이동할_URL")
2. 더 자주 쓰는 건: HttpResponseRedirect(reverse("url-name", args=[...]))
→ reverse()와 같이 쓰면 더 유연하게 이동 가능
The Reverse Function & Named URLs
reverse() 함수는 URL의 "이름(name)"을 이용해서 실제 URL 문자열을 "역으로" 생성해주는 함수이다.

challenges를 challege로 바꾸면 에러가 뜬다. january는 되지만 1은 안된다. -> view.py 에서도 challenges를 바꿔줘야 함.
시간이 지나면 이렇게 변하는 작은 수정들이 있을 텐데 프로젝트가 커질 수록 이런 에러를 찾기가 어려워진다.

에러를 줄이기 위해서 이런 식으로 코드를 수정해준다.
이렇게 하지 않으면 일일이 다 수정해줘야 함.
하드코딩은 문제점이 있다:
URL 패턴이 바뀌면 (예: /challenge/ → /monthly/) 모든 코드를 수정해야 함. 버그 발생 가능이 높고, 유지보수가 어려움.
reverse function:
* URL을 직접 하드코딩하지 않기 위해
* URL 구조가 바뀌어도 name만 같다면 코드 수정이 필요 없기 때문
* 템플릿에서도 {% url %}과 연결됨 (템플릿에서는 reverse 안 쓰고 {% url %}로 동일한 역할)
Returning HTML
웹사이트에 접속하면 그냥 plain text가 아니라 html 스타일로 보인다.
HTML 은 보통 CSS와 합쳐진다.
우리가 여태까지 만든 홈페이지는 그냥 글자만 존재하고 있다.


HTML형식으로 바꿔준다.
Practicing URLs, Views & Dynamic VIew Logic

결합 2가지
1. challenges/january를 또 다시 하드 코딩해야 한다
reverse function를 사용하고 싶다!
2. 모든 달의 모든 코드를 일일이 쳐야 한다.
이미 딕셔너리가 있다.
-> to kind of generate this string here, by just having unordered lists tags (<ul>, </ul>), which then wrap the list item text, which we generate dynamically by going through all the dictionary entries here and then adding them to the string step-be-step, so that at the end we have an unordered list with all the list items all the months, but it's generated automatically by code instead of hard coded by us
이 문장은 HTML 코드의 <ul>, </ul> 태그를 사용하여 문자열을 생성하고자 한다는 의미이다.
그 안에는 <li> 태그로 감싼 각 월(month)의 이름이 들어가게 된다.
이 <li> 항목들은 직접 하나하나 적는 것이 아니라, 코드로 자동 생성된다.
즉, monthly_challenges라는 딕셔너리의 key 값들을 하나씩 반복문으로 순회하면서, 해당 key(월 이름)를 <li> 태그로 감싸고, 그것을 하나의 문자열에 계속해서 추가하는 방식이다.
이렇게 하면 최종적으로 <ul> 태그로 감싸진, 12개월의 모든 월이 포함된 HTML 리스트가 만들어진다.
이 HTML 리스트는 직접 쓴 것이 아니라, 코드가 딕셔너리를 기반으로 자동으로 만들어낸 결과이다.
def index(request): # 모든 가능한 월을 표시하는 index를 담은 view
list_items = ""
months = list(monthly_challenges.keys())
for month in months:
capitalized_month = month.capitalize()
month_path = reverse("month-challenge", arge=[month])
list_items += f"<li><a href=\"{month_path}\">{capitalized_month}</a></li>"
response_data = """
<ul>
<li><a href="/challenges/january">January</a></li>
</ul>
"""
return HttpResponse()
# "<li><a href="...">January</a></li><li><a href="...">Febrary</a></li>..." -> 이런 식으로 동작하는 코드
urlpatterns = [
path("", views.index), # /challenges/
path("<int:month>", views.monthly_challenge_by_number),
path("<str:month>", views.monthly_challenge, name="month-challenge")
]

Summary
view: The logic that is executed for different URLs (and Http mothods)
function class
code that handles (evalutes) requests and returns responses
뷰(view)는 특정 URL 요청이 들어왔을 때, 그에 따라 어떤 로직을 실행하고 어떤 응답(response)을 돌려줄지를 결정하는 코드이다.
Django에서는 view를 함수형(function-based view) 또는 클래스형(class-based view) 으로 만들 수 있다.
전체 코드는 요기!
GitHub - mjpark-haezoom/Python-Django---The-Practical-Guide
Contribute to mjpark-haezoom/Python-Django---The-Practical-Guide development by creating an account on GitHub.
github.com
'Programming > Django' 카테고리의 다른 글
| [Python Django - The Practical Guide] Templates & Static Files (2) | 2025.07.18 |
|---|---|
| [Django] 템플릿에서 정적 파일(static file) 경로를 동적으로 만드는 방법 (0) | 2025.07.18 |
| [Django] 📘 Template Language (DTL) — 중요한 개념 3가지 (3) | 2025.07.18 |
| [Python Django - The Practical Guide] Course Setup (2) | 2025.07.16 |
| [Python Django - The Practical Guide] Getting Started (0) | 2025.07.16 |