🥕 추석을 보내며 Django를 뜯어보고 싶다는 생각이 들었다. 내가 아는 from - import 가 왜 그렇게 들어온건지 왜 그렇게 import를 해주어야만 하는지 어떤 과정, 루트로 그렇게 된건지 궁금해졌다. 이것뿐만 아니라 그냥 이것 저것. 모두다. 그냥 그렇게 해야하니까 쓰는거 말고 적어도 정확하게 이해는 하고 쓰고 싶다는 생각. 내가 공부했던 모든 뷰를 뜯어봐야지.🥕
Djano란 보안이 우수하고 유지보수가 편리한 웹사이트를 신속하게 개발하는 하도록 도움을 주는 파이썬 웹 프레임워크. 무료 오픈소스인데다가, 활발한 커뮤니티들이 있고, 좋은 참고자료와 무료 및 유료 지원을 하는 옵션들이 제공.
전형적인 데이터 기반 웹 사이트에서 웹 어플리케이션은 웹 브라우저(또는 다른 클라이언트)로부터 HTTP 요청(Request)을 기다린다. 요청을 받으면, 웹 어플리케이션은 URL과 POST 데이터 또는 GET 데이터의 정보에 기반하여 요구사항을 알아냄. 그 다음 무엇이 필요한 지에 따라, 데이터베이스로부터 정보를 읽거나 쓰고, 또는 필요한 다른 작업들을 수행할 것. 그 다음 웹 어플리케이션은 웹 브라우저에 응답(Response)을 반환하는데, 주로 동적인 HTML 페이지를 생성하면서 응답함.
🦖 URLs: 단일 함수를 통해 모든 URL 요청을 처리하는 것이 가능하지만, 분리된 뷰 함수를 작성하는 것이 각각의 리소스를 유지보수하기 훨씬 쉽다.(이건 동기들 사이에서도 많이 들어봤다. 각각의 view 파일을 만들어주는게 장단점이 있다고는 하지만 실제 현업에서 view 파일을 따로 만들어준다고들 한다.) URL mapper는 요청 URL을 기준으로 HTTP 요청을 적절한 뷰(view)로 보내주기 위해 사용됨. 또한 URL mapper는 URL에 나타나는 특정한 문자열이나 숫자의 패턴을 일치시켜 데이터로서 뷰 함수에 전달할 수 있음!
🦖 View: 뷰는 HTTP 요청을 수신하고 HTTP 응답을 반환하는 요청 처리 함수. 뷰는 Model을 통해 요청을 충족시키는데 필요한 데이터에 접근. 그리고 탬플릿에게 응답의 서식 설정을 맡김.
🦖 Models: 모델은 응용프로그램의 데이터 구조를 정의하고 데이터베이스의 기록을 관리(추가, 수정, 삭제)하고 쿼리하는 방법을 제공하는 파이썬 객체.
🦖 Templates: 탬플릿은 파일의 구조나 레이아웃을 정의하고(예: HTML 페이지), 실제 내용을 보여주는 데 사용되는 플레이스홀더를 가진 텍스트 파일. 🌱뷰는 HTML 탬플릿을 이용하여 동적으로 HTML 페이지를 만들고 모델에서 가져온 데이터로 채움.🌱 탬플릿으로 모든 파일의 구조를 정의할 수 있음.
Note: 위에 설명한 이유때문에 장고는 이 구조를 "모델 뷰 템플릿(Model View Template)(MVT)" 아키텍처라고 부른다. 뷰를 중심으로 모델에서 데이터베이스의 데이터를 가져오고 템플릿에서 HTML 페이지를 만들어서 URL로 들어온 request에 응답하는 것. 그래서 djnago가 MVT 패턴이라고 하는 것.
urlpatterns = [
path('admin/', admin.site.urls),
path('book/<int:id>/', views.book_detail, name='book_detail'),
path('catalog/', include('catalog.urls')),
re_path(r'^([0-9]+)/$', views.best),
]
urlpatterns 객체는 path()함수와 re_path() 함수를 항목으로 가지는 리스트.
두 메소드의 첫 번째 인수는 일치시킬 경로(패턴). path() 메소드는 꺾쇠 괄호(<, >)를 사용해서 인수를 정의함. 이 인수는 URL의 한 부분으로, 명명된 인수로 수집되어 뷰 함수로 보내짐. re_path() 함수는 정규식이라는 유연한 패턴 매칭 접근을 사용.
두 번째 인수는 패턴이 일치할 때 호출되는 다른 함수. views.book_detail은 이 함수가 book_detail()이며 views 모듈 안에서 찾을 수 있다는 것을 나타냄. (즉, views.py라는 파일 안에서).
뷰들은 웹 클라이언트로부터 HTTP 요청을 수신하고 HTTP 응답을 되돌려주는 웹 어플리케이션의 🔥심장🔥. 그 사이에 그들은 데이터베이스에 접근하고 템플릿을 렌더링하기 위해 프레임워크의 다른 자원들을 정리.
아래 예시는 이전 예시의 URL mapper가 불러올 수 있는 최소 뷰 함수 index()를 보여줌. 다른 모든 뷰 함수처럼 이 함수도 HttpRequest 객체를 인자(request)로 받고 HttpResponse 객체를 반환. 이 예시에서는 요청에 관해서는 아무것도 하지 않고, 단순히 하드코딩된 문자열을 반환함.
filename: views.py (Django view functions)
from django.http import HttpResponse
# django.http 모듈로 부터 HttpResponse객체를 받아오는거지!
def index(request): #요게 HttpRequest 객체를 인자로 받기
# Get an HttpRequest - the request parameter
# perform operations using information from the request.
# Return HttpResponse
return HttpResponse('Hello from Django!') # HttpResponse 객체를 반환해주기
Note: 파이썬에 관하여:
- Python modules은 우리가 코드에 쓰고 싶을지도 모르며 분리된 파일로 저장되어 있는 함수의 "라이브러리".
- from django.http import HttpResponse와 같은 방법으로 django.http 모듈에서 HttpResponse 객체만 가져와서 뷰에서 사용할 수 있음. 모듈에서 여럿, 아니면 전체 모듈을 임포트할 수 있는 몇 가지 방법이 있다!
- 함수들은 위에 보여진 것과 같이 def 키워드로 정의됨. 함수의 이름 뒤 괄호 안에는 명명된 인자들이 나열되어 있음. 전체 줄은 콜론으로 끝나고. 그 아랫 줄이 모두 들여쓰기 되어있음. 들여쓰기는 코드 행이 특정한 블록 안에 있다는 것을 나타내기 때문에 중요해!
# filename: models.py
from django.db import models
class Team(models.Model):
team_name = models.CharField(max_length=40)
TEAM_LEVELS = (
('U09', 'Under 09s'),
('U10', 'Under 10s'),
('U11', 'Under 11s'),
... #list other team levels
)
team_level = models.CharField(max_length=3, choices=TEAM_LEVELS, default='U11')
참고 : 파이썬에 대해
- 파이썬은 코드를 객체로 구성하는 프로그래밍 스타일인 "객체 지향 프로그래밍"을 지원함. 여기에는 관련 데이터 및 해당 데이터를 조작하기위한 함수가 포함. 객체는 다른 객체로부터 상속, 확장, 파생할 수 있어 관련 객체 간의 공통 동작을 공유 할 수 있음. 클래스의 모델을 기반으로 객체 유형의 여러 특정 인스턴스를 만들 수 있음!
장고 모델은 데이터베이스를 간단히 탐색하기 위한 쿼리 API를 제공! 이 API는 다양한 조건을 통해 수 많은 필드를 빠르게 매칭시킨다! (예를 들어, 정확하게 일치(exact), 대소문자 구분없이(case-insensitive), 해당 숫자보다 큰(greater than) 등이 있음.) 그리고 복잡한 쿼리문을 지원함~!
굵게 표시된 줄은 모델 쿼리 API를 사용하여 team_level 필드의 텍트스가 정확히 'U09'인 모든 레코드를 필터링하는 방법을 보여준다! (이 기준이 필드 이름의 인수로 filter() 함수에 전달되는 방법에 유의하기. 일치 유형은 team_level__exact와 같이 이중 밑줄로 구분).
## filename: views.py
from django.shortcuts import render
from .models import Team
def index(request):
list_teams = Team.objects.filter(team_level__exact="U09")
context = {'youngest_teams': list_teams}
return render(request, '/best/index.html', context)
참조: https://developer.mozilla.org/
🥕 매번 MVT 패턴만 외우다가 네트워크쪽 공부하고 다시 한 번 장고를 접하니 뭔가 이해가 수월해졌다는 기분이 드는건 기분탓일까!! API를 예쁘게 다시 공부해보고싶따!! 화이팅! 🥕