본문 바로가기
프로그래밍 놀이터/Script(Python)

[Django] 파이썬 웹 프로그래밍 - Django 웹 프레임워크 #1

by 돼지왕왕돼지 2016. 12. 9.

 [Django] 파이썬 웹 프로그래밍 - Django 웹 프레임워크 #1


$, *, +, ., 0번 또는 1번, 0번 이상 반복, 1번 이상 반복, ?, a-z, admin, any single char, API, application, charfield, controller, DateTime, db access, db engine, Django, django 웹 프레임워크, django.db, djnago, elegant url, HTML, httprequest, HttpResponse, ID, import, installed_apps, max_length, Model, model template view, model 규칙, Models, models.model, models.py, MTV, mtv 패턴, MVC, mysql, N, NOW, n}, object relational mapping, or, ORM, pip, pip install, pip 설치, PostgreSQL, Primary Key, Project, py, pypi, python, python install program, python package index, redirection, Regular Expression, RM, root_urlconf, settings.py, site-packages, site-packages/django, SQL, SQLITE3, SW, sys, sys.path, template, template_dirs, upgrade, url, url 분석, url 설계, URLconf, urlpatterns, urls.py, View, views.py, wget, [Django] 파이썬 웹 프로그래밍 - Django 웹 프레임워크, [], [^], \d, \w, ^, _, __path__, {m, {n}, _, 감시, 개발자, 객체, 객체 관계 매핑, 관리 기능, 관리자 화면, 괄호 안 문자 이외의 문자 하나, 구글 웽 엔진, 기본, 기존 장고 프로그램 삭제, 내부 프로젝트, 다국어 지원, 다리, 단위 프로그램, 데이터 모델, 데이터베이스, 데이터베이스 내부, 데이터베이스 설계, 디렉토리, 디버깅 모드, 디자인, 로렌스 저널, 로직, 메모리, 모델, 모델 클래스, 모듈, 문자열의 끝, 문자열의 시작, 밑줄, 뷰, 뷰 결정, 사이트 전체, 설치 확인, 소문자, 소스 변경사항 자동 반영, 숫자, 숫자 한개, 실패, 앱, 앱명, 에러, 영문, 영문 숫자 밑줄 한개, 오픈 소스 프로젝트, 요청, 우아한 url, 우아한 url 설계, 월드 신문, 웹 개발팀, 웹 사이트, 웹 엔진, 웹 프레임워크, 윈도우 장고 설치, 응답, 일반적인 특징, 자동 구성 관리자 화면, 자동 부여, 자체 템플릿 시스템, 장고, 장고 설치 디렉토리, 장고 수동 설치, 장고 업데이트, 장고 프로그램 설치, 장고에서의 앱 개발 방식, 정규식, 지정 순서, 직관, 처리, 추출 단어, 캐시 단위, 캐시 시스템, 캐시용 페이지, 컨벤션, 컬럼, 콘텐츠, 클라이언트, 클래스 메소드, 테스트용 웹 서버, 테이블, 테이블명, 텍스트형 언어, 템플릿, 파이썬, 파이썬 웹 프로그래밍, 파일 시슽템, 페이지, 풍부한 개발 환경, 프로젝트, 하나, 함수, 혹장, 화면 ui 설계, 확장자

-

책을 읽으며 Remind 하는 내용, 핵심 내용, 모르던 내용을 정리한 것입니다. 예문 및 자세한 설명은 책을 구매하여 보세요~



< 3.1. 일반적인 특징 >


-

2003년 로렌스 저널-월드 신문을 만들던 웹 개발팀의 내부 프로젝트로 시작.

2005년 오픈 소스 프로젝트로 공개.

구글의 앱 엔진에서 장고를 사용하면서 많은 사람들이 사용.

파이썬의 대표적인 웹 프레임워크로 자리매김.




* MVC 패턴 기반 MTV


-

장고는 MVC 를 기반으로 한 프레임워크이다.

장고에는 View 를 Template, Controller 를 View 라고 부른다.

그래서 장고를 흔히 MTV(Model-Template,View) 프레임워크라 부른다.




* 객체 관계 매핑


-

객체 관계 매핑( ORM, Object-Relational Mapping ) 은 데이터베이스 시스템과 데이터 모델을 연결시키는 다리와 같은 역할을 한다.




* 자동으로 구성되는 관리자 화면


-

웹 서버의 콘텐츠, 즉 데이터베이스에 대한 관리 기능을 위하여 프로젝트를 시작하는 시점에 기본 기능으로 관리자 화면을 제공한다.

이 관리자 화면을 통해 앱에서 사용하는 데이터들을 쉽게 생성 및 변경할 수 있다.

개발자가 별도로 관리 기능을 개발할 필요가 없다.




* 우아한 URL 설계




* 자체 탬플릿 시스템


-

내부적으로 확장이 가능하고 디자인이 쉬운 강력한 탬플릿 시스템을 갖고 있다.

화면 디자인과 로직에 대한 코딩을 분리하여 독립적으로 개발 진행이 가능하다.

장고의 템플릿 시스템은 HTML 과 같은 텍스트형 언어를 쉽게 다룰 수 있도록 되어 있다.




* 캐시 시스템


-

동적인 페이지를 만들기 위해 데이터베이스 쿼리를 수행하고 템플릿을 해석하며, 관련 로직을 실행해서 페이지를 생성하는 일은 서버에 엄청난 부하를 준다.

장고의 캐시 시스템은 캐시용 페이지를 메모리, 데이터베이스 내부, 파일 시스템 중 아무 곳에나 저장할 수 있다.

또 캐시 단위를 페이지에서부터 사이트 전체 또는 특정 뷰의 결과, 템플릿의 일부 영역만을 지정하여 저장해 둘 수 있다.




* 다국어 지원




* 풍부한 개발 환경


-

테스트용 웹 서버 등 여러가지 개발에 도움이 될 수 있는 기능을 제공한다.

디버깅 모드를 사용할 경우 에러를 쉽게 파악하고 해결할 수 있도록 아주 상세한 메시지를 보여준다.




* 소스 변경사항 자동 반영


-

*.py 파일의 변경 여부를 감시하고 있다가 변경되면 실행 파일에 변경 내역을 바로 반영해준다.

장고 테스트용 웹 서버 실행중인 상태에서 소스 파일 수정할 경우 웹 서버를 다시 시작할 필요가 없다.






< 3.2. 장고 프로그램 설치 >


* 3.2.1. 기존 장고 프로그램 삭제


-

pip 프로그램으로 설치하는 경우는 pip 프로그램이 예전 버전의 장고 프로그램을 자동으로 처리해주므로 삭제 과정을 불필요하다.

그러나 직접 설치하는 경우에는 삭제과정이 필요하다.


# cd /usr/lib/python3.5/site-packages/

# rm -rf django

$ rm -rf Django*



-

장고가 설치된 디렉토리는 아래와 같은 명령어로 알 수 있다.


$ python -c “import sys; sys.path = sys.path[1:]; import django; print(django.__path__)"


cf) -c 는 command 를 말하는데, 그 다음에 오는 것을 python 코드로 인식하고 실행한다.




* 3.2.2. pip 프로그램으로 설치


-

pip 는 python install program 의 약자.

파이썬의 오픈 소스 저장소인 PyPI(Python Package Index)에 있는 SW 패키지를 설치하고 관리해주는 명령이다.



-

pip 설치는 아래와 같이 한다.


# wget https://botstrap.pypa.io/get-pip.py

# python get-pip.py



-

장고 설치는 아래와 같이 한다.


# pip install Django


설치는 /usr/lib/python3.5/site-packages/django 에 설치된다.



-

장고 업데이트는 아래와 같이 한다.


# pip install Django —upgrade




* 3.2.3. 수동으로 설치


-

# wget https://www.djangoproject.com/download/1.7.4/tarball

# tar xzvf Django-1.7.tar.gz

# cd Django-1.7

# python setup.py install






* 3.2.4. 윈도우에서 장고 설치




* 3.2.5. 장고 프로그램 설치 확인


-

import django

print (django.get_version())






< 3.3. 장고에서의 앱 개발 방식 >


-

웹 사이트에 대한 전체 프로그램을 프로젝트(Project)라 하고,

모듈화된 단위 프로그램을 앱(Application)이라 부른다.

즉, 앱들이 모여서 프로젝트가 되는 형태이다.




* 3.3.1. MTV 패턴


-

클라이언트로부터 요청을 받으면 URLconf 모듈을 이용하여 URL 을 분석.

URL 분석 결과를 통해 해당 URL 에 대한 처리를 담당할 뷰를 결정.

뷰는 자신의 로직을 실행하면서, 만일 데이터베이스 처리가 필요하면 모델을 통해 처리하고 그 결과를 반환받는다.

뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트에 전송할 HTML 파일을 생성

뷰는 최종 결과로 HTML 파일을 클라이언트에게 보내 응답




* 3.3.2. Model - 데이터베이스 설계


-

모델은 사용될 데이터에 대한 정의를 담고 있는 장고의 클래스이다.

장고는 ORM 기법을 사용하여 앱에서 사용할 데이터베이스를 클래스로 매핑해서 코딩할 수 있다.

즉, 하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 컬럼에 매핑된다.

SQL 객체 없이도 DB Access 를 할 수 있다.

SQLite3, MySQL, PostgreSQL 등 DB Engine 을 변경하더라도 ORM 을 통한 API 는 변경할 필요가 없어서 좋다.



-

ex)

from django.db import models


class Person(models.Model):

     first_name = models.CharField(max_length=30)

     last_name = models.CharField(max_length=30)


# 위 코드는 id, first_name, last_name column 을 가진 appName_className table 을 생성한다.



-

장고의 Model 을 해석해 Table 을 만드는 규칙은..

테이블명 : 앱명과 테이블 클래스명을 밑줄(_) 로 연결하고 모두 소문자로 표시한다.

Primary Key : Person 클래스에서 정의하지 않아도 장고에서 자동으로 부여한다. 물론 개발자가 직접 지정할 수도 있다.



-

장고는 모델 클래스로부터 테이블을 자동 생성하기 위해 models.py 파일에 정의된 모델 클래스를 해석하고 여러 가지 규칙을 적용한다.




* 3.3.3. Template - 화면 UI 설계


-

템플릿 파일은 *.html 확장자를 가지며, 장고의 템플릿 시스템 문법에 맞게 작성한다.

유의할 점은 템플릿 파일을 적절한 디렉토리에 위치시켜야 한다는 것.

즉, 장고에서 템플릿 파일을 찾는 방식을 이해하고 있어야 하며, 장고는 적절한 위치에 템플릿 파일이 위치해야 템플릿 파일을 찾을 수 있다.



-

장고에서 템플릿 파일을 찾을 때는 프로젝트 설정 파일인 settings.py 파일에 정의된 TEMPLATE_DIRSINSTALLED_APPS 속성에 지정된 디렉토리를 검색한다.

여러 개의 디렉토리를 지정할 수 있는데, 지정된 순서대로 디렉토리를 검색하여 템플릿 파일을 찾을 수 있다.


TEMPLATE_DIRS 항목에 정의된 디렉토리를 먼저 찾고, 그 다음에 INSTALLED_APP 항목의 디렉토리를 찾는다.


예를 들어 아래와 같이 settings.py 에 정의되어 있다면..


INSTALLED_APPS = (

     ‘django.contrib.admin’,

     ‘django.contrib.auth’,

     ‘polls’,

)


TEMPLATE_DIRS = [‘/home/admin/mysite/templates’]


아래의 순서로 template 를 찾는다.


/home/admin/mysite/templates

/usr/lib/python3.5/site-packages/django/contrib/admin/templates

/usr/lib/python3.5/site-packages/django/contrib/auth/templates

/home/admin/mysite/polls/templates




* 3.3.4. URLconf - URL 설계


-

파이썬의 URL 지정 방식은 전통적인 자바나 PHP 계열의 URL 보다 직관적이고 이해하기 쉽다.

그래서 우아한(Elegant) URL 이라고 부른다.

URL 을 정의하기 위해서는 urls.py 에 URL 과 처리 함수(뷰, View)를 매핑하는 파이썬 코드를 작성해주면 된다.


ex)

from django.conf.urls import patterns, url

from . import views


urlpatterns = patterns(‘',

     url(r’^articles/2003/$’, views.special_case_2003),

     url(r’^articles/(\d{4})/$’, views.year_archive),

     url(r’^articles/(\d{4}/(\d{2})/$’, views.month_archive),

     url(r’^articles/(\d{4}/(\d{2})/(\d+)/$’, views.article_detail),

)



-

URL 자체에 처리 함수나 처리용 스크립트 파일 이름이 들어가면 변경이 어렵지만, 위와 같은 매핑은 유연하다.



-

웹 클라이언트가 웹 서버에 페이지 요청 시, 장고에서 URL 을 분석하는 순서는..

setting.py 파일의 ROOT_URLCONF 항목을 읽어 URLconf(urls.py)의 위치를 알아낸다.

URLconf 모듈을 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사한다.

위에서부터 순서대로 URL 리스트의 내용을 검사하면서 매치가 되면 검사를 종료한다.

매치가 된 URL 의 뷰를 호출한다. 여기서 뷰는 함수 또는 클래스 메소드이다.

호출 시 HttpRequest 객체에서 추출된 단어들을 뷰에 인자로 넘겨준다.

리스트 끝까지 검사했는데도 매칭에 실패하면 에러를 처리하는 뷰를 호출한다.



-

URL 정규식 표현의 문자 의미는..

. : 모든 문자 하나 (any single char)

^ : 문자열의 시작

$ : 문자열의 끝

[] : 괄호 안에 있는 문자 하나, [akz] 라면 a 또는 k 또는 z 중 하나

[^] : [] 괄호 안에 있는 문자 이외의 문자 하나, [^ab] 라면 a 와 b 를 제외한 문자 하나

* : 0번 이상 반복, {0,} 과 동일

+ : 1번 이상 반복, {1,} 과 동일

? : 0번 또는 1번 반복, {0,1} 과 동일

{n} : n 번 반복

{m, n} : 최소 m번에서 최대 n 번까지 반복

| : Or, 예를 들어 A|B 라면, A 또는 B

[a-z] : a에서 z까지 임의의 문자, 영문 소문자 한 개

\w : 영문, 숫자 또는 밑줄 한개, [0-9a-zA-Z_] 와 동일

\d : 숫자 한개, [0-9]와 동일




* 3.3.5. View - 로직 설계


-

장고에서의 뷰는 함수 또는 클래스의 메소드로 작성되며, 웹 요청을 받고 응답을 반환해준다.

여기서 응답은 HTML 일수도 있고, Redirection 일 수 있고, 404 에러일 수도 있다.



-

뷰는 보통 views.py 파일에 작성하지만, 원한다면 다른 파일에 작성해도 무방하다.

다만 파이썬 경로에 있는 파일이어야 찾을 수 있다.



-

ex) 함수로 작성한 뷰

from django.http import HttpResponse

import datetime


def current_datetime(request):

     now = datetime.datetime.now()

     html = “<html><body>It is now %s.</body></html>” %now

     return HttpResponse(html)

     # return HttpResponseNotFound(‘<h1>Page not found</h1>’) 와 같이 에러를 return 할 수도 있다.


cf) string formatting 은 '%s %s' % ('one', 'two') 와 같이 한다.

    위의 방식은 old style 이고 new style 은 '{} {}'.format('one', 'two') 와 같이 한다.








댓글0