이 글은 [파이썬 웹 프로그래밍](저자 김석훈, 출판사 한빛미디어) 교재를 보고 공부하며 정리한 글임.
3.1 일반적인 특징
장고 : 현재 가장 많이 사용되는 파이썬 웹 프레임 워크
<장고 웹 프레임워크의 주요 기능별 특징>
1. MVC(Model-View-Controller) 패턴 기반 MVT(Model-View-Template)
View : Template
Controller : View
Model : 데이터베이스에 액세스하는 컴포넌트
View : 데이터를 가져오고 변형하는 컴포넌트
Template : 데이터를 사용자에게 보여주는 컴포넌트
2. 객체 관계 매핑
데이터 베이스 시스템 & 데이터 모델 클래스를 연결시키는 다리와 같은 역할
3. 자동으로 구성되는 관리자 화면
4. 우아한 URL 설계
5. 자체 템플릿 시스템
6. 캐시 시스템
7. 다국어 지원
8. 풍부한 개발 환경
9. 소스 변경사항 자동 반영
3.2 장고 프로그램 설치
파이썬의 버전을 확인.
3.x 버전 이다.
pip으로 장고 설치.
장고 버전 출력해보기.
3.3 장고에서의 애플리케이션 개발 방식
프로젝트 : (장고에서) 웹 사이트에 대한 전체 프로그램
애플리케이션 : (장고에서) 모듈화된 단위 프로그램
-> 즉, 애플리케이션 프로그램이 모여 프로젝트를 개발
3.3.1 MVT 패턴
MVC 패턴 : 데이터(Model), 사용자 인터페이스(View), 데이터 처리하는 로직(Controller)을 구분해서 한 요소가 다른 요소들에 영향주지 않도록 설계하는 방식
장고 프레임워크에서는...
MVT 패턴이라함
- 모델(Model)은 데이터 베이스에 저장되는 데이터
- 템플릿(Template)은 사용자에게 보여지는 UI
- 뷰(View)는 실질적으로 프로그램 로직이 동작하여 데이터 가져오고 처리한 결과를 템플릿에 전달하는 역할 수행
MVT 패턴에 따라 처리하는 과정 요약
클라이언트로부터 요청받음
URLconf 이용하여 URL 분석
분석 결과를 통해 처리 담당할 뷰 결정
뷰는 자신의 로직 실행하며 데이터베이스 처리 필요하면 모델을 통해 처리, 결과 반환받음
뷰는 자신의 로직 처리 끝나면 템플릿 사용해 HTML 파일 생성 후 클라이언트에게 전송
3.3.2 Model - 데이터베이스의 정의
모델 : 데이터에 대한 정의 담고 있는 장고의 클래스
ORM 기법 이용해 하나의 모델 클래스 -> 하나의 테이블에 매핑
ORM 이란?
Object - Relational Mapping. 객체와 관계형 데이터베이스를 연결해주는 역할
테이블명 : 애플리케이션명과 모델 클래스 명을 밑줄( _ )로 연결하고 모두 소문자.
3.3.3 URLconf - URL 정의
장고는 클라이언트의 요청을 받으면 요청안에 있는 URL을 분석함.
(urls.py 파일에 정의된 URL 패턴과 매칭이 되는지를 분석)
꺾쇠 사용해서 <type:name> 형식으로 쓰면 URL 패턴의 일부 문자열을 추출할 수 있음.
ex)
<int:year>로 썼는데 요청 URL이 /article/2018/ 처럼 정수로 매칭되면 2018이 year에 할당됨.
장고에서 꺾쇠를 Path Converter라고 부름.
- str : / 제외한 모든 문자열과 매치
- int : 0또는 양의정수 매치
- slug : ASCII, 숫자, 하이픈, 밑줄 과만 매치
- uuid : UUID형식의 문자열과 매치
- path : / 포함한 모든 문자열과 매치
3.3.4 View - 로직 정의
URL을 분석하고 그 URL에 매핑된 뷰를 호출
뷰는 보통 views.py 파일에 작성하지만 다른 파일에 작성해도 무방.
3.3.5 Template - 화면 UI 정의
장고가 클라이언트에게 최종적으로 반환하는 건 HTML 텍스트임.
이제 클라이언트가 이 HTML을 해석해서 우리가 보이는 화면에 UI를 보여주는 것임.
개발자가 작성하는 *.html 파일을 템플릿 이라고 부름
템플릿 파일은 장고의 템플릿 시스템 문법에 맞게 작성하는데
템플릿 파일을 적절한 디렉토리에 위치시켜야함.
템플릿 파일 찾을때에 INSTALLED_APPS, TEMPLATES 에서 지정된 앱의 디렉토리를 검색하는데
이것들은 settings.py에 정의 되어 있음.
(TEMPLATES 항목에 정의된 디렉토리를 먼저 찾음)
3.3.6 MVT 코딩 순서
정해진 순서는 없지만
모델 먼저 코딩 -> 뷰와 템플릿은 이후에 같이 코딩
하는게 일반적임
3.4 애플리케이션 설계하기
실습으로 개발할 애플리케이션은 설문에 해당하는 질문 보여주고 답변 항목에 투표 -> 결과 알려주는 예제
예를 들면
화면 UI 설계 : index.html, detail.html, results.html .... 만들기
테이블 설계 : 질문을 저장하는 Question 테이블, 선택용 답변항목 저장하는 Choice 테이블... 만들기
3.5 프로젝트 뼈대 만들기
프로젝트에 필요한 디렉토리와 파일들 구성, 설정파일 셋팅하기
기본테이블 생성하기
관리자 계정인 슈퍼유저 생성하기
뼈대 디렉토리 및 파일에 대한 설명은 p.108 참고
3.5.1 프로젝트 생성
mysite 라는 프로젝트를 만들어 보자
django-admin startproject mysite 라는 명령어를 입력했을 때 자꾸
'django-admin.py'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
라는 오류가 발생했는데 업데이트 이것저것하고 path 환경 변수 추가 해줬는데 해결이 되긴 했다.
이거 해결하느라 오래걸렸다.. 😭
일단 Django라는 파일안에다가 mysite 라는 파일을 만들어 줬는데 그 파일안에 들어가면 또 mysite가 있다.
상위 디렉토리인 mysite는 여러 디렉토리와 파일을 모으는 역할만 하기 때문에 특별한 의미는 X
따라서 헷갈리지 않도록 ch3으로 이름을 바꾸어 준거다.
그리고 ch3에 들어가 polls이라는 애플리케이션을 만들었다.
python manage.py startapp polls 라는 명령어를 썼다.
-> 장고가 polls라는 애플리케이션 디렉토리와 하위에 필요한 파일들을 알아서 만들어준다.
안에 뭐가 들었는지 확인해보자.
3.5.3 프로젝트 설정 파일 변경
프로젝트의 설정값들은 settings.py 에 지정되어 있다고 했었다.
4가지를 확인할거다. 일단 settings.py 을 열어본다.
1. ALLOWED_HOSTS 항목을 지정해야함.
DEBUG=True -> 개발모드
=False -> 운영모드 -> ALLOWED_HOSTS에 서버의 IP나 도메인 지정해야함
지금은 개발모드이니까 True이고, 장고으 runserver를 기동할 서버의 IP가 127.0.0.1 일 뿐만 아니라 다른 것일 수 있다 면 다음처럼 지정하면 됨.
2. 프로젝트에 포함되는 애플리케이션은 설정파일에 등록해야함.
우리가 개발하는 polls 애플리케이션을 등록해야함 -> 애플리케이션의 설정 클래스로 등록하자
우리가 startapp polls 라고 명령을 쳤기 때문에 apps.py에 PollsConfig 라고 정의됨.
장고가 설정 클래스 찾을 수 있도록 INSTALLED_APPS에 새로운 줄을 추가
3. 데이터베이스 엔진
장고는 디폴트 데이터베이스 엔진이 SQLite3 이다. MySQL이나 Oracle, PostgreSQL 등 다른걸로 바꿀 수 있음(setting.py에서)
4. 타임존 지정
처음에는 세계표준시(UTC)로 되어있지만 한국시간으로 변경하자
3.5.4 기본 테이블을 작성해보자
데이터베이스 테이블 만들지 않았는데왜 이 명령이 필요할까?
장고는 개발할때 사용자와 그룹 테이블이 필요하다는 가정하에 설계되었기 때문에 개발 시작 시점에 이 명령 해줘야함.
migrate 명령 쓰면 실행결과로 SQLite3 데이터베이스 파일인 db.sqlite3 파일이 생성된 것을 확인할 수 있음.
3.5.5 지금까지 작업 확인하기
지금까지의 작업으로 장고가 제공하는 웹 페이지와 테이블을 확인할 수 있음.
웹 서버를 시행하고 접속해보자
장고는 개발 과정 도중에 현재 상태를 확인할 수 있도록 runserver 라고 하는 간단한 테스트용 웹 서버 제공
cmd에 명령어 적어보자
python manage.pyn runserver 0.0.0.0:8000
0.0.0.0이란 IP주소의 의미는 현재 명령을 실행중인 서버의 IP주소가 뭐든 웹 접속 요청을 받겠다는 의미
runserver 중지할때에는 Ctrl+c
이제 웹 브라우저 열고 주소창에 http://127.0.0.1:8000/ 입력
이번에는 장고에서 기본적으로 제공하는 Admin 사이트에 접속해서 생성된 테이블 확인하자
IP주소와 포트번호는 동일하고, URL 경로만 /admin으로 변경
http://127.0.0.1:8000/admin
로그인하려면 username이랑 password 넣어야하는데 생성을 아직 안했다
admin 사이트에 로그인하기위한 관리자(슈퍼유저) 만들어보자
장고에서 만들어준 Groups 테이블과 Users 테이블을 확인가능
admin 사이트에서는 앞으로 만들 테이블에 대한 데이터들을 입력, 변경, 삭제 등을 할수 있다.
users 와 groups 테이블이 여기서 보이는 건 settings.py 파일에 django.contrib.auth 애플리케이션이 등록되어 있어서임.
-> auth 앱에 users와 groups 테이블 미리 정의되어 있어서
프로젝트의 뼈대는 다 만들었다.
디렉토리를 한 번 확인해보자.
3.6 애플리케이션 개발하기 - Model 코딩
모델작업 : 데이터베이스에 테이블을 생성하는 작업
순서
- 테이블 정의
- 정의된 테이블 Admin 화면에 보이게 함
- 데이터베이스에 변경 필요한 사항 추출
- 데이터베이스에 변경사항 반영
- 작업을 개발용 웹 서버로 확인
3.6.1 테이블 정의
내가 만들 polls라는 애플리케이션에는 Question, Choice 라는 테이블이 필요
-> 이것들은 models.py 에 저장
클래스 변수명은 컬럼명을 그대로 매핑
3.6.2 Admin 사이트에 테이블 반영
Admin 사이트에 내가 방금 만든 테이블들도 보이도록 등록
models.py에저 정의했던 클래스를 임포트하고 등록
admin.site.register() -> 등록하는 함수
결론 : 테이블을 새로 만들 땐 models.py와 admin.py 수정
3.6.3 데이터베이스 변경사항 반영
테이블을 새로 만들거나
테이블의 정의를 변경해주는 등 데이터 베이스에 변경사항이 있으면
python manage.py makemigrations
python manage.py migrate
라는 명령어로 변경사항을 데이터베이스에 반영
3.6.4 지금까지 작업 확인하기
models.py 파일에 테이블 정의하고 데이터베이스에 반영해보고, Admin 사이트에 등록까지했음.
Admin 사이트에 들어가 확인해보자
runserver 실행시키고 웹 브라우저 주소창에 http://127.0.1:8000/admin 입력