'll Hacker
[WIL] 2주차, Django의 MVT 아키텍처 이해 본문
MVT 패턴
Model
- 데이터베이스와의 상호작용을 관리하여, 데이터 구조와 비즈니스 로직을 정의
- Django ORM을 통해 데이터를 쉽게 조회, 저장, 업데이트 가능
View
- 클라이언트의 요청을 받아 필요한 데이터를 처리하고, 응답을 준비
- Model에서 데이터를 가져와 Template에 전달하여 최종 응답을 생성
Template
- 사용자에게 보여질 HTML 파일을 담당하며, View에서 전달된 데이터를 시각적으로 표현
- Django의 템플릿 언어를 사용해 동적으로 데이터를 표시 가능
웹 클라이언트의 요청을 받고, 장고에서 MVT패턴에 따라 처리하는 과정
- 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석
- URL 분석 결과를 통해 해당 URL에 대한 처리를 담당할 뷰를 결정
- 뷰는 자신의 로직을 실행하면서 만일 데이터베이스 처리가 필요하면 모델을 통해 처리하고 그 결과를 반환받음
- 뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트 전송할 HTML 파일을 생성
- 뷰는 최종 결과로 HTML파일을 클라이언트에게 보내 응답.
URLconf? - URL 정의
클라이언트로부터 받은 요청에 들어있는 URL이 urls.py 파일에 정의된 URL 패턴과 매칭되는지 분석
URL을 정의하기 위해서 urls.py파일에 URL과 처리함수(뷰)로 매핑하는 파이썬 코드를 작성
이 때, URL/뷰 매핑을 URLconf라고 한다.
Django에서 URL 분석 순서
- settings.py 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf(urls.py)의 위치를 알아낸다
- URLconf를 로딩하여 urlpatterns 변수에 지정되어있는 URL 리스트를 검사
- 위에서부터 순서대로 URL 리스트의 내용을 검사하면서 URL 패턴이 매치되면 검사 종료
- 매치된 URL의 뷰를 호출. 여기서 뷰는 함수 또는 클래스의 메소드이다.
호출 시 HttpRequest 객체와 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨줌 - URL 리스트 끝까지 검사했는데도 매칭에 실패하면 에러를 처리하는 뷰를 호출
Path converter
URL 패턴의 일부 문자열을 추출
url의 int가 qna_id라는 변수명으로 view에서 활용
re_path 정규식을 활용한 매칭 문자열
' - '. ' : ' , 혹은 단어 문자(알파벳 대소문자, 특수기호 등)으로 이루어진 1개 이상의 문자열을 key로서 view에 전달
표현 | 정의 |
. (dot) | 모든 문자 하나 (any single character) |
^ | 문자열의 시작 |
$ | 문자열의 끝 |
[ ] | [ ] 괄호에 있는 문자 하나, 예를들어 [akz]라면 a 또는 k 또는 z |
[^ ] | [ ] 괄호에 있는 문자 이외의 문자 하나. 만일 [^ab]면 a와 b를 제외한 문자 하나 |
* | 0번 이상의 반복. {0,}와 동일 |
+ | 1번 이상의 반복. {1,} 와 동일 |
? | 0번 또는 1번 반복. {0, 1}와 동일 |
{n} | n번 반복 |
{m, n} | 최소 m 번에서 최대 n번까지 반복 |
| | 예를들어 A|B라면 A 또는 B |
[a-z] | a에서 z 까지 임의의 문자. 즉 영문 소문자 한개 |
₩w | 영문, 숫자 또는 밑줄(_) 한개. [0-9a-zA-Z]와 동일 |
₩d | 숫자 한개. [0-9]와 동일 |
더 쉽게 말해보자면
빨간색 네모 친 부분을 보면
URL 패턴을 정의할 때 int:qna_id처럼 꺽쇠를 사용하는 부분이 있는데, 이것을 Path Converter이라고 한다.
이것은 URL 패턴의 일부 문자열을 추출하기 위한 것이고,
type:name 형식으로 사용한다.
str | /(슬래시)를 제외한 모든 문자열과 매치됨. 타입이 지정되지 않았다면 디폴트로 str 타입을 사용한다 |
int | 0 또는 양의 정수와 매치됨. 매치된 정수는 파이썬의 int 타입으로 변환됨 |
slug | slug 형식의 문자열(ASCII, 숫자, 하이픈, 밑줄로만 구성)과 매치됨 |
uuid | UUID 형식의 문자열과 매치 매치된 문자열은 파이썬의 uuid 타입으로 변환됨 |
path | /(슬래시)를 포함한 모든 문자열과 매치됨 이는 URL 패턴의 일부가 아니라 전체를 추출하고자 할 때 많이 사용. |
View - 로직 정의
Django에서 로직은 함수 혹은 클래스의 메소드로 작성되며 클라이언트의 요청을 처리하고 그에 맞는 결과값을 반환
작성한 view는 urls.py를 통해 연결
결과값을 HTML로 변환하기 위하여 템플릿 처리한 후 최종 HTML로 된 응답데이터를 웹 클라이언트로 반환함.
+ 장고에서 View는 함수 또는 클래스의 메소드로 작성
Request
페이지가 요청되면 장고는 요청에 대한 메타데이터가 포함된 HttpRequest 개체를 생성
그런 다음 장고는 적절한 뷰를 로드하여 HttpRequest를 뷰 함수의 첫 번째 인수로 전달
각 뷰는 HttpResponse 개체를 반환하는 역할을 합니다.
Request 메타데이터
1. Http Method
- 클라이언트가 서버에 어떤 작업을 요청하는지 명시
ex) GET, POST, PUT, DELETE, PATCH 등
2. URL
- 요청의 대상 리소스를 나타내는 URL 경로
3. Headers
- 요청에 대한 추가 정보를 전달하는 key-value 형태
- Host, User-Agent, Content-Type 등을 포함
4. Body
- 요청 본문에 포함된 데이터
- 주로 POST, PUT, PATCH 메서드에서 사용
HttpRequest
장고는 django.http 모듈의 HttpRequest와 HttpResponse 객체를 통해 서버와 클라이언트 간의 통신 지원
- HttpRequest.body - Request의 body 객체
- HttpRequest.header - Request의 header 객체
- HttpRequest.method - Request를 보내는 방법
- HttpRequest.GET - GET 파라미터를 담고 있는 딕셔너리 같은 객체
- HttpRequest.user - 요청을 보낸 클라이언트(사용자)
HttpResponse / JsonResponse
HttpResponse는 view에서 return함
데이터를 json형태로 return 해야할 때 HttpResponse가 아닌 JsonResponse를 사용
- HttpResponse.content - Response의 raw content
- HttpResponse.headers - Response의 header 객체
- HttpResponse.cookies - Response에 포함된 쿠키 객체
- HttpResponse.status_code - Response를 통해 보낼 status_code(200(정상), 404(오류) 등)
redirect / render
redirect
- 지정된 url로 redirect하며, 첫번째 인자로 반드시 url이 들어가야하며 절대경로나 상대경로 이용가능
render
- Template을 HttpResponse와 엮어 쉽게 반환해주는 함수. contexxt에는 view에서 사용하던 변수를 html 템플릿에서 전달하는 역할.
Templates - 화면 UI 정의
Django가 클라이언트에 반환하는 최종 응답은 HTML이다.
개발자가 응답에 사용할 *.html 파일을 작성하면, 장고를 이를 해석해서 최종 HTML 텍스트 응답을 생성하고 이를 클라이언트에게 보내줌.
템플릿 파일은 *.html 확장자이며, 장고의 템플릿 시스템 문법에 맞게 작성
유의할 점은 템플릿 파일을 적절한 디렉터리에 위치시켜야함.
즉, 장고에서 템플릿 파일을 찾는 방식을 이해하고 있어야됨!!!
1. 생성한 앱 디렉토리 아래 templates 디렉터리 생성
2. html 파일 생성
3. render(request,'index.html') 통해 경로 지정
4. 외부에 templates 파일을 만들어 관리하는 경우, setting.py에 template base dir을 명시
Templates 언어가 따로 있음
- Template 태그
- Django 템플릿에서 논리적 처리를 위해 사용
- 주로 반복, 조건문 등 제어구조에서 처리하는데 사용
- 문법
- {% for in %} ~ {% endfor %}
- {% if %} ... {% elif %} ... {% else %) ... {% endif %}
- Template 변수
- 뷰에서 전달된 데이터를 템플릿에서 표현하기 위한 변수
- 중괄호 두 개 ({{ }})로 감싸서 사용
- 변수의 값을 HTML에 출력
- Template 필터
- 변수의 값을 변경하거나 포맷을 지정하는데 사용
- 파이프 기호를 사용하여 변수에 적용
- date, length, lower 등 자주 사용
과제
사용자가 아이디와 비밀번호를 입력했을때,
ID=guest, PW=guest가 아니면 로그인 실패(400번 상태를 띄워주는) 맞으면 로그인성공(200번 상태를 띄워주는)
로그인 페이지를 구현해보았다.
# myApp/views.py
from django.shortcuts import render
from django.http import JsonResponse
from django.contrib.auth import authenticate
def login_view(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if username == 'guest' and password == 'guest':
# 아이디와 비밀번호가 올바르면 로그인 성공 메시지
return JsonResponse({"message": "로그인 성공"}, status=200)
else:
# 잘못된 아이디 또는 비밀번호
return JsonResponse({"message": "로그인 실패"}, status=400)
return render(request, 'login.html')
# myApp/urls.py를 생성
from django.urls import path
from .views import login_view
urlpatterns = [
path('login/', login_view, name='login'),
]
# myProject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myApp.urls')),
]
# myApp/templates/login.html
<!DOCTYPE html>
<html>
<head>
<title>로그인</title>
</head>
<body>
<h2>로그인</h2>
<form method="post" action="/login/">
{% csrf_token %}
<label for="username">아이디:</label>
<input type="text" id="username" name="username"><br>
<label for="password">비밀번호:</label>
<input type="password" id="password" name="password"><br>
<button type="submit">로그인</button>
</form>
</body>
</html>
python manage.py runserver
예로 ID를 1234, pw를 1234를 입력해보았다.
이번에는 ID를 guest, PW를 guest로 올바르게 입력해보았다.
참고 :
https://butter-shower.tistory.com/49
'Dev > GDSC' 카테고리의 다른 글
[WIL] 5주차, Django REST Framework(DRF) (6) | 2024.11.16 |
---|---|
[WIL] 4주차, Django 사용자 인증 시스템 (0) | 2024.10.11 |
[WIL] 3주차, Django의 모델 및 데이터베이스 (1) | 2024.10.04 |
[WIL] 1주차, Django 기본 이해 및 환경설정 (0) | 2024.09.20 |
gdsc ewha 합격 후기 (1) | 2024.09.10 |