티스토리 뷰
이전 포스팅은 django를 사용하기 위한기본적인 설정을 했다면 이번에는 사용하는 방법을 익힐 차례다. 정확히 흐름을 익히면 자연스럽게 작성이 가능하다고 하는데, 그렇게 됐으면 좋겠다..!
Django Design Pattern
: 소프트웨어 설계에서 발생하는 문제를 해결하기 위한 해결책으로 공통적인 문제를 해결하는 데 쓰이는 관행이다. MVT(Model, View, Controller)와 MTV(Model, Template, View)가 있는데 django에서는 후자를 택한다. 패턴은 동일하나 django에서 명칭만 다르게 정의한것이다. (View -> Template, Controller -> View으로 단순한 명칭 변경)
: 애플리케이션을 구조화하는 패턴 (데이터 & 사용자 인터페이스 & 비지니스 로직)으로 이해하면 된다.
Model(모델)
- 데이터베이스와 관련된 작업을 수행
- 데이터 구조를 정의하고 상호작용하는 메소드를 제공
Template(템플릿)
- 사용자에게 보여지는 화면의 모습을 정의
- HTML, CSS, JavaScript 등의 마크업 언어를 사용하여 웹 페이지의 레이아웃 및 디자인 결정
View(뷰)
- 사용자의 요청을 처리, 데이터 제공, 템플릿을 렌더링하여 사용자에게 응답을 제공
- 클라이언트의 HTTP 요청을 수신, 모델로부터 데이터를 가져와 템플릿에 전달
Django project | Django application |
애플리케이션의 집합 (DB 설정, URL 연결, 전체 앱 설정) ex) 카페 (전체 설정 담당) |
독립적으로 작동하는기능 단위 모듈 각자의 기능을 담당하며 다른 앱들과 하나의 프로젝트를 구성 ex) 카페 내 게시글, 댓글, 회원 등 (DB, 로그인, 화) |
python manage.py startapp articles
python : 파이썬 인터프리터 호출
manage.py : 프로젝트 관리 유틸리티 'manage.py' 파일 실행
startapp : django 내에서새로운 앱을 시작하는 명령
articles : 생성할 앱의 이름으로 사용자가 원하는 이름으로 변경가능, 다만 앱의 이름은 복수형으로 지정하는 것을 권장
>> 새로운 앱의 구조를 정의하고 앱이 동작하는데필요한 코드와 설정을 포함 하는 'articles' 라는 이름을가진 새로운 디렉토리가 프로젝트 디렉토리 내에 생성
project 생성과 헷갈리지말고, 앱의 기능을 기준으로 생성할 앱의 이름을 설정한다. 또한 project 생성시에는 ' .'을 붙여 현재 디렉토리 기준으로 생성했지만, app은 사용하게되면 project내에 파일들이 퍼지기 때문에 관리, 유지보수가 어렵고 다수의 앱을 사용하게 된다면 문제가 생긴다. 따라서 마침표는 적지 않는다.
필수사항
반드시 앱을 생성한 후에 등록을 해야한다.
흐름으로 이해하자. 프로젝트 속 app이 생성된 것이기 때문에 등록을 한다고 생각하면 어디 위치에 있는 파일을 수정해야 할까? 흐름상 myproject가 더 큰 영역이므로 수정 위치는 project임을 인지하고, 내부 settings.py에 INSTALLED_APPS 를 찾아 추가해주면 된다. 역시 흐름상 APP을 설치했으니 위치가 INSTALLED_APPS가 되는 것이고, 다만 추가할 때 주의사항이 두가지가 있다.
- 생성된 APP은 가장 위부터 추가한다. 이는 명시된 순서대로 로드가 되기때문에 앱의 순서가 중요할 수 있다.
- 생성된 APP을 적은 뒤에 반드시 ', '을 적어 다른 데이터들과 분리를 해줘야한다. 하나의 문자열로 받기 때문에 앱을 인식하지 못하는 경우가 생긴다.
project와 app의 구조
- settings.py
- 프로젝트의 모든 설정을 관리
- 데이터베이스 설정, 앱 등록, 정적 파일 및 템플릿 디렉토리 경로 등
- urls.py
- 클라이언트 요청 들어오는 URL에 따라 해당하는 views에 연결
- __init__.py
- 해당 디렉토리를 python 패키지로 인식하게 하는 빈 파일
- 일반적으로 파일을 비워두고 사용하지 않음
- asgi.py
- ASGI 프로토콜을 통해 django 프로젝트를 비동기 웹 서버와 연결하는 파일
- 비동기 : 한 가지 작업의 완료를 기다리지 않고 다른 작업을 동시에 수행하는 프로그래밍 개념
- wsgi.py
- WSGI 프로토콜을 통해 django 프로젝트를 웹 서버와 연결하는 파일
- 배포 시 웹 서버와 django 애플리케이션을 연결하는데 사용
- manage.py
- 계속 언급했던 역할로, django 프로젝트와 상호작용하는 커맨드라인 유틸리티
- admin.py
- 관리자용 페이지 설정
- 앱의 데이터 모델을 추가, 수정, 삭제할 수 있음
- models.py
- 데이터베이스 테이블의 구조와 관련된 Model을 정의
- MTV 패턴 중 M에 해당하며 데이터베이스와 상호작용할 때 이 파일의 모델 클래스들이 사용
- views.py
- HTTP의 요청을 받아 처리하고 템플릿을 렌더링하거나 JSON 형식의 데이터를 반환하는 등의 작업
- view 함수 또는 클래스를 정의하는 파일 (url, model, template와 연계)
- MTV 패턴 중 T에 해당된다
- apps.py
- 앱의 이름과 구성을 설정하는 등 앱을 정의하는 파일
- tests.py
- 개발자가 임시로 작성한 테스트 코드를 저장하는 용도
- 특정 기능이나 모듈의 테스트 코드를 작성하는데 사용
초록 글씨를 제외한 파일들은 건드리지 않는 것을 추천한다.
한번의 요청으로 응답까지 돌아오는 길의 과정을 살펴보자
1.urls
우리가 가장 먼저 생성했던 큰 틀은 프로젝트였다. 해당하는 디렉토리의 urls.py를 오픈해보면 기본 설정들은 3가지가 있을 것이다. 프로젝트 내에 app을 생성했으니 app에서 연결되는 url들을 관리해줘야 한다.
from articles import views
현재 프로젝트에서 articles 앱의 views.py 파일을 가져와서 사용하는 것을 의미한다. 이를 작성함으로서 views.py에 정의되어있는 view 함수와 클래스를 호출할 수 있게 연결했다.
urlpatterns
URL 패턴을 정의하는 '목록'으로 해당 목록을 통해 적절한 뷰 함수를 찾는다.
path('index/', views.index),
path() : django에서 URL 패턴을 정의하는데 사용되는 함수로 해당 패턴에 Mapping되는 뷰 함수 또는 클래스를 연결한다.
path(route, view, kwargs=None, name=None)
- route : URL 패턴을 나타내는 문자열로 클라이언트가 요청하는 URL에 대응
- view : 해당 URL 패턴에 대한 요청을 처리할 view 함수나 클래스를 가르킴
- kwargs : 선택 키워드 인자로 추가적으로 뷰에 전달할 인자들을 딕셔너리 형태로 전달할 수 있음
- name : URL 패턴에 이름을 지정하는 것, 선택적인 매개변수
위를 참고하여 우리가 추가한 코드를 이해해보자
"사용자가 'index/' url로 접속하게 되면 우리가 연결해둔 app의 views파일에 index 함수 또는 클래스를 실행시킨다."
이다. 이때 전체 url은 http://127.0.0.1:8000/index/ 로 요청이 들어올 경우이다.
우리는 views.py 내부에 index라는 함수를 정의하지 않았기 때문에 views.index 중 index에 파란불이 들어오지 않은 것도 확인 가능하다.(나중에 작성하고 오면 불이 들어온다)
2. views
앞서 url 설정을 마쳤는데, 그렇다면 이번에는 views.py를 수정하러 가야겠지 않겠는가? 앞서 말했던 흐름을 계속 따라간다고 생각하면 된다.
url 경로에서 먼저 선언했던 index 함수를 정의하면 된다.
from django.shortcuts import render : django의 'render' 함수를 현재 모듈로 가져온다. render는 html 템플릿을 렌더링하여 사용자에게 보여줄 수 있는 HttpResponse 객체를 생성한다.
index 라는 함수를 정의하는데, 클라이언트로부터 HTTP 요청(request)을 처리하기 위해 사용된다. 모든 view 함수는 첫번째 인자로 request 요청 객체를 필수적으로 받는다. 물론 매개변수명이 request가 아니어도 되지만 항상 말했듯 관행이다.
>> request를 매개변수로 index가 호출되면 return으로 render함수를 실행시키는데 이때, render 함수에 인자로 request와 'articles/index.html'을 넘겨준다.
즉, 넘겨진 request와 articles/index.html은 render가 실행시키는 것인데 render 함수가 html 템플릿을 렌더링하여 HttpResponse 객체를 생성한다고 이해하면 된다.
물론 아직 우리는 articles/index.html 은 생성하지 않았다.
3. templates
views.py에서 articles/index.html 이라고 생각해서 app의 폴더 명인 articles에 index.html을 생성하여 views.py와 같은 위치선상에 놓이게 만드는 경우가 있는데, 전혀 아니다.
django는 templates라는 폴더를 직접 생성해주고 해당 하위 폴더에 이름이 articles에서 파일 index.html을 만들어줘야한다. 물론 template 하위 폴더로 articles 디렉토리명을 사용하지 않아도 되고, 심지어 바로 templates에 html 파일을 넣어도 된다. 대신 앞서 정의한 views.py 함수에서 인자로 넘겨줄 파일 경로를 꼭 수정해줘야 한다.
이때 templates라는 디렉토리 명은 반드시 지켜져야한다.
이유는 django 기본 설정으로 render함수가 실행되어 템플릿을 찾을 때, templates 디렉토리를 검색하기 때문이다.
settings.py 내부를 살펴보면 'APP_DIRS' : True 부분이 app 내부의 templates를 탐색하겠는지 확인하는 부분이다. 그리고 'DIRS' : [] 부분은 추후에 app내부가 아닌 외부에서도 탐색을 할 수 있게 하려면 직접 경로를 설정해줄 수 있다.
그럼 html 파일을 편하게 적어보고 페이지를 요청해보러 가보자.
가상환경 On, runserver를 해보자.
올해 1월에 알고리즘 시작할때나 python으로 출력해봤던 CodingLarva 였던거같은데 오랜만에봐서 뿌듯하기도 하고 닉넹미 잘 지은거같아서 기분 좋다.귀여워.
흐름의 순서로 urls.py - views.py - templates 를 수정했다. UVT라고 나는 앞글자만 따서 외우긴 했는데, 이 흐름을 따라가기가 쉽지 않더라. 왜냐면 다음에 만들어 질 것을 만들다 보니 내 생각 흐름과 다른 것 같다. 나는 TVU가 쉬울거같은데... 더 배우면 이유가 있겠지!
'일상코딩 > 노트' 카테고리의 다른 글
Django : Template inheritance (0) | 2024.03.16 |
---|---|
Django : Template Language (DTL) (1) | 2024.03.14 |
Django : 환경구축 (0) | 2024.03.12 |
Web : CSS (Box Model) (0) | 2024.03.07 |
Python : 순열(Permutation) Review (2) | 2024.02.28 |
- Total
- Today
- Yesterday
- Database
- basic syntax
- ChatGPT
- 순열
- baby-gin
- Sequence types
- 연산자
- vue
- 카운팅정렬
- ssafy
- dfs
- 삼성청년SW아카데미
- SQLite
- Component
- JavaScript
- views.py
- SQL
- Python
- Django
- vue3
- 백준
- HTML
- 재귀
- honeymoney
- CodeTree
- refactoring
- 함수
- Method
- app
- Authentication System
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |