Django 다시 보기 ➿

On a regular basis·2021년 9월 22일
0
post-thumbnail

🥕 추석을 보내며 Django를 뜯어보고 싶다는 생각이 들었다. 내가 아는 from - import 가 왜 그렇게 들어온건지 왜 그렇게 import를 해주어야만 하는지 어떤 과정, 루트로 그렇게 된건지 궁금해졌다. 이것뿐만 아니라 그냥 이것 저것. 모두다. 그냥 그렇게 해야하니까 쓰는거 말고 적어도 정확하게 이해는 하고 쓰고 싶다는 생각. 내가 공부했던 모든 뷰를 뜯어봐야지.🥕

Django란?

Djano란 보안이 우수하고 유지보수가 편리한 웹사이트를 신속하게 개발하는 하도록 도움을 주는 파이썬 웹 프레임워크. 무료 오픈소스인데다가, 활발한 커뮤니티들이 있고, 좋은 참고자료와 무료 및 유료 지원을 하는 옵션들이 제공.

전형적인 데이터 기반 웹 사이트에서 웹 어플리케이션은 웹 브라우저(또는 다른 클라이언트)로부터 HTTP 요청(Request)을 기다린다. 요청을 받으면, 웹 어플리케이션은 URL과 POST 데이터 또는 GET 데이터의 정보에 기반하여 요구사항을 알아냄. 그 다음 무엇이 필요한 지에 따라, 데이터베이스로부터 정보를 읽거나 쓰고, 또는 필요한 다른 작업들을 수행할 것. 그 다음 웹 어플리케이션은 웹 브라우저에 응답(Response)을 반환하는데, 주로 동적인 HTML 페이지를 생성하면서 응답함.

  • Django 웹 어플리케이션은 전형적으로 아래와 같이 분류된 파일들에 대해 일련의 단계를 수행하는 코드로 구성되어 있음:

🦖 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 패턴이라고 하는 것.

  1. 요청을 알맞은 뷰로 전달 (urls.py)
    URL mapper는 보통 urls.py라는 이름의 파일에 저장되어 있음. 아래 예시에서 urlpatterns 맵퍼는 경로들(특정 URL 패턴들)과 해당하는 뷰 함수에 대한 맵핑 목록들을 정의함. 만약 지정된 URL 패턴과 일치하는 HTTP 요청이 수신된다면 관련된 view 함수가 요청을 전달.
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라는 파일 안에서).

  1. 요청 처리하기 (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 키워드로 정의됨. 함수의 이름 뒤 괄호 안에는 명명된 인자들이 나열되어 있음. 전체 줄은 콜론으로 끝나고. 그 아랫 줄이 모두 들여쓰기 되어있음. 들여쓰기는 코드 행이 특정한 블록 안에 있다는 것을 나타내기 때문에 중요해!
  1. 데이터 모델 정의하기 (models.py)
  • 장고 웹 어플리케이션은 모델(models)이라는 파이썬 객체를 통해 데이터를 관리하고 쿼리함. 모델은 필드 타입과 그들의 최대 크기, 기본 값들, 선택 목록 옵션, 문서의 도움말 텍스트, 폼(form)을 위한 labe text등을 포함하여 저장된 데이터의 구조를 정의. 모델의 정의는 기본 데이터베이스와 별개. 본인의 프로젝트 설정의 일부로써 여러 모델 중 하나를 선택할 수 있음. 본인이 사용할 데이터베이스를 정했다면, 그것에 직접적으로 접근할 필요가 없음. 그저 모델 구조와 다른 코드들을 작성하면, 장고가 당신과 데이터베이스가 소통하는 데 필요한 모든 더러운 작업들을 처리함 ^^ (장고의 특장점! ORM)
  • 아래 코드는 Team 객체를 위한 아주 간단한 장고 모델을 보여줌. Team 객체는 장고 클래스models.Model에서 파생되었따! 이 객체는 팀 이름과 팀 레벨을 캐릭터 필드로 정의하고 각각의 기록에 저장될 최대 캐릭터 숫자를 정함. team_level은 랜덤으로 값이 선정되기 때문에, 우리는 이를 choice 필드로 정의하며, choices들 간에 선택된 값이 보여지고 디폴트 값에 따른 데이터가 저장되도록 함.
# 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')

참고 : 파이썬에 대해

  • 파이썬은 코드를 객체로 구성하는 프로그래밍 스타일인 "객체 지향 프로그래밍"을 지원함. 여기에는 관련 데이터 및 해당 데이터를 조작하기위한 함수가 포함. 객체는 다른 객체로부터 상속, 확장, 파생할 수 있어 관련 객체 간의 공통 동작을 공유 할 수 있음. 클래스의 모델을 기반으로 객체 유형의 여러 특정 인스턴스를 만들 수 있음!
  1. 데이터 쿼리하기 (views.py)
  • 장고 모델은 데이터베이스를 간단히 탐색하기 위한 쿼리 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)
  • 이 함수는 render() 함수를 사용하여 브라우저로 다시 전송되는 HttpResponse를 만든다. 지정된 HTML 템플릿과 템플릿에 삽입할 일부 데이터("컨텍스트"라는 변수에 제공)를 결합하여 HTML 파일을 생성합니다.
  1. 데이터 렌더링 (HTML 템플릿)
  • 템플릿 시스템을 사용하면 페이지가 생성될 때 채워질 데이터에 자리 표시자를 사용하여 출력 문서의 구조를 지정할 수 있음. 템플릿은 종종 HTML을 만드는 데 사용되지만 다른 유형의 문서를 만들 수도 있음. 장고는 기본 템플릿 시스템과 Jinja2라는 인기있는 파이썬 라이브러리를 모두 지원함!

참조: https://developer.mozilla.org/

🥕 매번 MVT 패턴만 외우다가 네트워크쪽 공부하고 다시 한 번 장고를 접하니 뭔가 이해가 수월해졌다는 기분이 드는건 기분탓일까!! API를 예쁘게 다시 공부해보고싶따!! 화이팅! 🥕

profile
개발 기록

0개의 댓글