Korean translation of http://www.djangoproject.com/documentation/tutorial1
. |
[../Tutorial2] |
--> |
당신의 첫번째 장고 프로그램 만들기, part 1
이 문서는 Django 0.9.1을 다룬다. 구버전 : 0.90 docs
By Adrian Holovaty <holovaty@gmail.com>, Translated by [parkpro77]
예제로 배워보자.
이 튜토리얼을 통해서 우리는 당신에게 간단한 웹 투표 프로그램을 만드는 것을 알려줄 것이다.
웹 투표 프로그램은 두 부분으로 구성된다.
- 사람들이 투표를 제안하고 투표의 결과를 보게 하는 공식 페이지
- 당신이 비밀리에 투표를 추가하고, 바꾸고, 삭제하는 관리자 페이지
우리는 당신이 이미 장고를 설치했다고 가정한다.
초기설정
당신이 장고를 처음 사용하는 것이라면, 당신은 몇몇 초기설정에 주의해야 한다.
django-admin.py startproject myproject 명령을 실행하라. 그것은 당신의 현재 디렉토리에 myproject 디렉토리를 만들 것이다.
(만약 당신이 setup.py를 통해 장고를 설치했다면, django-admin.py는 당신의 시스템 경로에 있을 것이다. 만약 당신의 경로가 아니라면, 당신은 site-packages/django/bin 에서 그것을 찾을 수 있다; /usr/local/bin처럼 당신의 경로에 어떤 장소로부터 그것의 심볼릭 링크를 고려하라.)
{{| 이 코드가 어디에 있습니까?
당신의 배경이 [PHP]라면, 당신은 웹서버의 document root 아래 아마도 코드가 있을 것이다 (/var/www 같은 장소에). 장고와 함께, 당신은 그것을 하지 마라. 당신의 웹서버의 document root 내에 이 파이썬 코드가 약간이라도 있는 것은 좋지 않다. 왜냐하면 그것은 사람들이 웹에서 당신의 코드를 볼지도 모르는 가능성을 감수해야 하기 때문이다. 그것은 보안상 좋지 않다.
당신의 코드를 /home/mycode 같이 document root의 바깥 디렉토리에 두어라. |}}
프로젝트는 데이타베이스 구성, 장고의 특별한 옵션, 프로그램의 특별한 설정을 포함하는 장고의 실례를 위한 설정의 모음이다.
myproject/ __init__.py manage.py settings.py urls.py
이 파일들은 :
- manage.py : 다양한 방식에서 장고 프로젝트와 상호작용하는 명령어 라인 프로그램.
- settings.py : 장고 프로젝트를 위한 설정/구성
- urls.py : 장고 프로젝트를 위한 URL 선언; 당신이 만든 장고 사이트의 "목차"
개발 서버
개발서버가 없다면, myproject 디렉토리로 가서 python manage.py runserver 명령을 실행하라. 당신은 명령어 라인에서 다음과 같은 출력을 보게 될 것이다.
Validating models... 0 errors found. Starting server on port 8000 with settings module 'myproject.settings'. Go to http://127.0.0.1:8000/ for Django. Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows).
(만약 당신이 DATABASE_ENGINE에 대한 에러를 얻는다면, 정확한 데이타베이스를 찾아주기위해 DATABASE_ENGINE을 바꿔서 당신의 settings.py파일을 고치고, PostgreSql's psycopg 이나 [MySQL]'s [MySQLdb] 같은 설치 되어진 올바른 데이타베이스 라이브러리를 준비한다.)
당신은 파이썬의 표준 라이브러리에 포함되어진 BaseHTTPServer를 이용하여 만들어진 가벼운 순수 파이썬 웹서버를 시작했다. 우리는 장고에 이런것들을 포함했다. 그래서 당신은 제작할 준비가 될때까지 구성하는 [Apache]를 처리하지 않아도 빠르게 이런것을 개발할 수 있다.
어떤것이라도 공통점이 있는 제작환경에서 이 서버를 사용하지 마라. 그것은 오직 개발하는 동안만 사용하기위해 의도된 것이다.
{{| 포트를 바꿔라
초기설정에 의해, runserver 명령은 포트 8000에서 개발을 시작한다. 당신이 서버의 포트를 바꾸길 원한다면, 그것을 명령어 라인 인수로서 바꿔라.
python manage.py runserver 8080
|}}
지금, 서버가 돌고 있는 상태에서, 당신의 웹브라우저를 통해 http://127.0.0.1:8000/ 을 방문하라. 당신은 연한 파란 색조의 산뜻한 "Welcome to Django"라는 페이지를 볼 것이다. 작업이 완료되었다!
데이타베이스 설정
지금, settings.py를 고쳐라. 그것은 모듈 수준에서 다양하게 표현되어지는 장고 설정을 따르는 평범한 파이썬 모듈이다. 당신의 데이타베이스 연결 변수에 맞게 이 설정들을 바꿔라 :
- DATABASE_ENGINE -- 'postgresql', 'mysql' 또는 'sqlite3'. 곧 더 나온다.
- DATABASE_NAME -- 당신의 데이타베이스 이름, 만약 당신이 [Sqlite]를 사용한다면, 데이타베이스 파일의 완전한 경로
- DATABASE_USER -- 당신의 데이타베이스 유저네임 (SQLite는 사용 안한다.)
- DATABASE_PASSWORD -- 당신의 데이타베이스 패스워드 (SQLite는 사용 안한다.)
- DATABASE_HOST -- The host your database is on. 만약 당신의 데이타베이스 서버가 같은 물리적인 기계를 사용한다면, 이것을 빈 문자열로 남겨라 (SQLite는 사용 안한다.)
{{| 주의
여기에서 지정한 데이타베이스가 PostgreSQL 또는 [MySQL] 에 생성되어있어야 한다. 당신이 사용하는 데이타베이스의 프롬프트에서 "CREATE DATABASE database_name;" 명령어로 데이터베이스를 만들 수 있다. |}}
당신의 데이터베이스에 장고의 코어 데이타베이스 테이블을 생성하기 위해서 다음 명령을 실행하라.
python manage.py init
당신이 어떤 에러 메세지도 보지 못한다면, 작업이 완료 된것이다.
궁금하다면, 당신의 데이타베이스를 위한 명령행 클라이언트를 띄워서 \dt (PostgreSQL), SHOW TABLES; ([MySQL]), or .schema (SQLite) 같은 명령어를 입력해서 장고에 의해서 생성된 테이블들을 볼 수 있다.
{{| 이 데이터베이스 테이블들에 대해서
manage.py init 에 의해서 생성된 테이블들은 장고가 제공하는 세션, 인증등의 기능을 위해서 필요한 것들이다. 장고의 다음 릴리즈에서는 당신이 원하지 않는다면 어떤 테이블도 생성하지 않는 init 명령어의 간단한 형식이 제공 될 것이다. |}}
모델 만들기
지금, 당신의 project는 정해졌고, 작업을 할 준비가 되어있다. (당신은 다시 지루한 관리상의 도구를 신경쓰지 않아도 될 것이다.)
당신이 장고에서 쓰고 있는 각각의 프로그램은 파이썬 경로 어딘가에 있는 파이썬 패키지로 구성되고, 확실한 협정을 따른다. 장고는 프로그램의 기본적인 디렉토리 구조에서 자동으로 발생하는 유틸리티를 따른다. 그래서 당신은 창작하는 디렉토리 보다는 쓰고 있는 코드에 초점을 맞출 수 있다.
{{| 프로젝트 vs. 프로그램
프로젝트와 프로그램의 다른 점은 무엇인가? 프로그램은 예를 들면 [Blog] 시스템이나 공적인 기록의 데이타베이스, 간단한 투표 프로그램 같은 것들을 하는 웹 프로그램이다. 프로젝트는 시스템 구성과 특별한 웹 싸이트를 위한 프로그램의 모음이다. 프로젝트는 다수의 프로그램들을 포함할 수 있다. 프로그램은 다수의 프로젝트들 안에 존재할 수 있다. |}}
이 튜토리얼에서 우리는 간단하게 myproject 디렉토리 안에 투표 프로그램을 만들 것이다. 결과적으로, 프로그램은 프로젝트와 연결될 것이다. 말하자면, 투표 프로그램 내에 파이썬 코드는 myproject.polls를 참조할 것이다. 나중에 이 튜토리얼에서, 우리는 배포를 위해서 당신의 프로그램을 분리하는 것을 검토할 것이다.
프로그램을 만들기 위해서, myproject 디렉토리 안에서 이 명령을 쳐라.
python manage.py startapp polls
이와 같은 표로 polls 디렉토리를 만들 것이다.
polls/ __init__.py models/ __init__.py polls.py views.py
이 디렉토리 구조는 투표 프로그램을 저장할 것이다.
장고에서 데이타베이스 웹 프로그램을 작성하는 첫 번째 단계는 당신의 모델을 정의하는 것이다. -- 본래는, 추가적인 metadata와 함께 당신의 데이타베이스 설계
{{| 원리
모델은 하나이고, 당신의 데이타에 대한 데이타의 명확한 소스이다. 그것은 본질적인 항목과 당신이 저장하고 있는 데이타의 상태를 포함한다. 장고는 [DRY] 원칙을 따른다. 목표는 한 장소에서 당신의 데이타 모델을 정의하고, 그것으로부터 자동적으로 얻어내는 것이다. |}}
간단한 투표 프로그램에서, 우리는 polls와 choices 두 개의 모델을 만들 것이다. poll은 질문과 공식적인 날짜를 가진다. choice는 choice의 본문과 투표 기록을 갖는다. 각각의 choice는 poll과 연관되어 있다.
이런한 개념들은 간단한 파이썬 클래스들에 의해 표현되어졌다. polls/models/polls.py 파일을 이와 같이 수정하라.
이 코드는 간단하다. 각 코드는 django.core.meta.Model을 세분화하는 클래스에 의해 표현되어졌다. 각 모델은 많은 클래스 변수와 모델에서 데이타베이스 항목을 표현하는 각각을 가진다.
각 항목은 meta.*Field 클래스의 인스턴스에 의해 표현되어졌다 -- 예를들면, 캐릭터 항목을 위한 meta.CharField 와 데이트타임을 위한 meta.DateTimeField. 이것은 장고가 각 항목의 데이타 형식이 무엇을 가지고 있는지 말해준다.
각 meta.*Field 인스턴스의 이름 (예를들면, question이나 pub_date)은 기계 친화적인 형태인 항목의 이름이다. 당신은 파이썬 코드에서도 이 이름을 사용할 것이고, 데이타베이스 또한 컬럼 이름으로서 그것을 사용할 것이다.
당신은 사람이 읽을 수 있는 이름을 명명하기 위해 Field에 임의의 첫번째 자리 인수를 사용할 것이다. 그것은 장고의 몇 개의 내적인 부분에 사용되고, 문서와 일을 겸한다. 이 항목이 제공되어지지 않았다면, 장고는 기계가 읽을 수 있는 이름으로 사용될 것이다. 이 예로부터 우리는 Poll.pub_date를 위해서 사람들이 읽을 수 있는 이름을 정의했었다. 이 모델에서 다른 모든 항목들을 위해서, 항목의 기계가 읽을 수 있는 이름은 사람이 읽을 수 있는 이름으로서 충분할 것이다.
몇몇 meta.*Field 클래스들은 요소들을 필요로 했다. 예를 들어, meta.CharField는 maxlength가 필요하다. 그것은 데이타베이스 설계뿐만 아니라 증명에서도 사용했고, 곧 볼 수 있을 것이다.
결과적으로, meta.ForeignKey를 사용하면서 관계가 분명해졌다는 것에 주목하라. 장고의 각 Choice는 하나의 Poll과 연결되어졌다. 장고는 모든 평범한 데이타베이스 관계를 제공한다; 다수 대 하나, 다수 대 다수, 하나 대 하나.
모델 작동시키기
모델 코드의 작은 비트는 장고에게 많은 정보를 준다. 그것과 함께, 다음과 같은 일들을 할 수 있다:
- 이 프로그램을 위한 데이타베이스 설계하기 (CREATE TABLE 문들)
- Poll과 Choice 객체들을 제어하기 위한 파이썬 데이타베이스-제어 API 만들기
그러나, 첫째로 우리는 polls 프로그램이 설치되어진 프로젝트가 필요하다.
{{| 원리
장고 프로그램은 '꼽았다 뺐다 할 수 있는(pluggable)' 형태이다. 그것이 주어진 장고 설치에 의지하지 않기 때문에, 다중 프로젝트에서 프로그램을 사용할 수 있고, 배포할 수 있다. |}}
다시 settings.py 파일을 열어서, INSTALLED_APPS 위치에 'myproject.polls'를 삽입해라. 그러면, 이와 같이 보일 것이다.
INSTALLED_APPS = ( 'myproject.polls', )
(콤마 쓰는 것을 잊지 말아라, 왜냐하면 단독-값 튜플에 대한 파이썬의 규칙이기 때문이다. 콤마가 없다면, 파이썬은 이것이 튜플인지 알지 못한다.)
지금, myproject는 polls 프로그램을 포함하고 있다. 다른 명령을 실행해 보자.
python manage.py sql polls
다음과 같은 것을 보게 될 것이다. (polls 프로그램을 위한 CREATE TABLE SQL 문):
BEGIN; CREATE TABLE "polls_polls" ( "id" serial NOT NULL PRIMARY KEY, "question" varchar(200) NOT NULL, "pub_date" timestamp with time zone NOT NULL ); CREATE TABLE "polls_choices" ( "id" serial NOT NULL PRIMARY KEY, "poll_id" integer NOT NULL REFERENCES "polls_polls" ("id"), "choice" varchar(200) NOT NULL, "votes" integer NOT NULL ); COMMIT;
다음을 주목하라:
- 테이블 이름은 객체이름 (polls와 choices)의 복수 버전과 함께 프로그램 (polls)의 이름을 결합에 위해 자동적으로 생성되어졌다. (이것은 변경이 가능하다.)
- Primary keys (IDs)는 자동적으로 추가되어졌다. (이것 역시 변경 가능하다.)
- 장고는 협약에 의해 foreign key 항목 이름으로 "_id"를 추가하였다. 역시 변경 가능하다.
- foreign key 관계는 REFERENCES 문에 의해 명료하게 만들어졌다.
- 그것은 당신이 사용하는 데이타베이스 목적에 맞추었다. 그래서 auto_increment ([MySQL])이나 serial (PostgreSQL), integer primary key (SQLite) 같은 특별한 항목 형식의 데이타베이스는 자동적으로 처리되어진다. 같은 것은 항목 이름의 인용부호를 쓰는 것으로 간주된다. -- 예를들면, 이중인용부호나 단일인용부호의 사용. 이 튜토리얼의 저자는 PostgreSQL을 실행하기 때문에 예제 출력은 PostgreSQL 문법으로 되어 있다.
관심이 있다면, 다음 명령들을 실행해 보라.
- python manage.py sqlinitialdata polls -- 장고의 관리체제에 필요한 초기 데이타 삽입의 출력.
- python manage.py sqlclear polls -- 이 프로그램을 위한 필수 DROP TABLE 문을 출력, 테이블들이 당신의 데이타베이스 안에 이미 존재한다는 것에 의해서 (가령 있다 할지라도).
- python manage.py sqlindexes polls -- CREATE INDEX 문을 출력.
- python manage.py sqlall polls -- 'sql' 과 'sqlinitialdata' 의 결합.
이런 명령들의 출력을 보면 실제적으로 무슨 일이 일어났는지 알 수 있을 것이다.
이제, 자동적으로 polls 프로그램의 데이타베이스 테이블들을 만들기 위해 이 명령을 실행하라.
python manage.py install polls
비밀리에 명령 수행의 모든 것은 python manage.py sqlall polls 의 출력을 가지고, 장고 settings 파일의 데이타베이스 안에서 그것을 실행한다.
manage.py 유틸리티가 무엇을 하는지 대한 정보를 알고 싶으면 django-admin.py documentation 를 읽어라.
API 가지고 놀기
지금, 서로 작용하는 파이썬 쉘로 일에 착수하고, 장고에 있는 공짜 API를 가지고 놀자. 파이썬 쉘을 구하기 위해 이 명령을 사용하라.
python manage.py shell
manage.py 는 프로젝트의 환경을 구성하기 때문에 간단하게 'python'이라고 치는 것 대신에 이것을 사용하고 있다. "Setting up the environment"는 다음 두 가지를 포함하고 있다:
- sys.path 위에 myproject를 넣어라. 유연성을 위해, 장고의 몇몇 부분들은 파이썬에서 (도트 경로 표기법) 프로젝트들을 언급한다 (예를들어 'myproject.polls.models'). 이런 것들을 하기 위해서, myproject 패키지는 sys.path 위에 존재해야 한다. 우리는 이런 것의 한 예를 이미 보았다: INSTALLED_APPS 구성은 도트 경로 표기법에서 패키지들의 목록이다.
- 당신의 settings.py 파일의 경로에서 장고가 준 다양한 DJANGO_SETTINGS_MODULE 환경을 구성한다
{{| manage.py 접근법
당신이 manage.py를 사용하지 않는다해도 문제 없다. myproject를 확인하는 것은 파이썬 경로의 루트 레벨에서이고 (다시 말하면, import myproject), myproject.settings에서 다양한 DJANGO_SETTINGS_MODULE 을 구성하는 것이다.
더 많은 정보를 얻고 싶으면, django-admin.py documentation 을 보라. |}}
일단 쉘 안에 있다면, API 데이타베이스를 조사하라.
1 # django.models안에 모듈들이 동적으로 생성된다.
2 # 모델 클래스 이름들은 복수형이다.
3 >>> from django.models.polls import polls, choices
4
5 # 아직까지 시스템내에 투표설문들은 없다.
6 >>> polls.get_list()
7 []
8
9 # 새 투표설문을 만든다.
10 >>> from datetime import datetime
11 >>> p = polls.Poll(question="What's up?", pub_date=datetime.now())
12
13 # 생성된 객체를 데이터베이스에 저장한다. save() 를 명시적으로 호출해야한다.
14 >>> p.save()
15
16 # 그러면 ID가 만들어진다. 당신이 사용하는 데이터베이스에 따라 "1"대신에
17 # "1L"이 나올 수도 있다. 대단한 사항은 아니다. 데이터베이스 후단(backend)
18 # 에서 파이썬 Long형 정수들 처럼 정수들을 리턴하는 것을 선호한다는 의미이다.
19
20 >>> p.id
21 1
22
23 # 파이썬 객체속성을 통해 데이터베이스에 접근한다.
24 >>> p.question
25 "What's up?"
26 >>> p.pub_date
27 datetime.datetime(2005, 7, 15, 12, 00, 53)
28
29 # 속성을 변경하고, save()를 호출하여 저장한다.
30 >>> p.pub_date = datetime(2005, 4, 1, 0, 0)
31 >>> p.save()
32
33 # get_list() 는 데이터베이스상의 모든 투표를 보여준다.
34 >>> polls.get_list()
35 [<Poll object>]
<Poll object> 는 도움이 되지 않는 표현이다. polls/models/polls.py 파일에서 polls 모델을 편집하고, Poll과 Choice 둘 다 repr() method 를 추가하자.
대화형 프롬프트를 처리할 때 뿐만 아니라 객체의 표현은 장고의 자동적으로 생성되어진 admin을 통해 사용되어지기 때문에 당신의 모델에 repr() methods 를 추가하는 것은 중요하다.
이 평범한 파이썬 함수를 주목하라. 아래와 같이 사용자 메쏘드를 추가한다.
import datetime 이 필요하지 않다는 것에 주목하라. 각 모델의 메쏘드는 파이썬 표준 라이브러리로부터 datetime 모듈을 포함하는 편의를 위해 흔히 쓰이는 변수에 포함하고 있다.
다시 python manage.py shell 을 실행하기 위해 파이썬 대화형 쉘로 돌아가라.
>>> from django.models.polls import polls, choices # 추가한 __repr__()이 제대로 동작하는지 확인한다. >>> polls.get_list() [What's up?] # 장고는 키워드 인수를 이용한 다양한 데이터베이스 룩업 API를 제공한다. >>> polls.get_object(id__exact=1) What's up? >>> polls.get_object(question__startswith='What') What's up? # 연도가 2005년인 설문을 취해본다. 물론 당신이 이 튜토리얼을 실험해보는 현재 연도를 넣어야 한다. >>> polls.get_object(pub_date__year=2005) What's up? >>> polls.get_object(id__exact=2) Traceback (most recent call last): ... PollDoesNotExist: Poll does not exist for {'id__exact': 2} >>> polls.get_list(question__startswith='What') [What's up?] # 기본키(Primary key)를 이용하여 접근해보라. 장고는 기본키 검색을 위한 단축키를 제공한다. # 다음 예제는 polls.get_object(id__exact=1) 과 동등하다. >>> polls.get_object(pk=1) What's up? # 추가한 사용자메쏘드가 제대로 동작하는지 확인한다. >>> p = polls.get_object(pk=1) >>> p.was_published_today() False # 투표설문에 여러개의 선택(choice)을 부여한다. 각각의 메쏘드 호출은 INSERT문을 수행하고, # 새로운 Choice 객체를 리턴한다. >>> p = polls.get_object(pk=1) >>> p.add_choice(choice='Not much', votes=0) Not much >>> p.add_choice(choice='The sky', votes=0) The sky >>> c = p.add_choice(choice='Just hacking again', votes=0) # Choice 객체는 관련된 Poll 객체에 접근할 수 있는 API를 갖고 있다. >>> c.get_poll() What's up? # 역으로, Poll 객체는 Choice 객체들에 접근할 수 있다. >>> p.get_choice_list() [Not much, The sky, Just hacking again] >>> p.get_choice_count() 3 # API는 자동적으로 당신이 정의한 관계를 따른다. # 관계들(relationships)은 "__"로 분리된다. # 당신이 원하는 깊은 관계 레벨까지도 동작할 것이다. # 2005년의 pub_date를 갖는 모든 Poll의 모든 Choices들은 다음처럼 찾는다. >>> choices.get_list(poll__pub_date__year=2005) [Not much, The sky, Just hacking again] # choices 가운데 하나를 지워보자. delete() 메쏘드를 이용한다. >>> c = p.get_choice(choice__startswith='Just hacking') >>> c.delete()
API 데이타베이스에 세부 항목을 보려면 [../DbApi]를 참고한다.
API 사용이 익숙해지면, 장고의 자동 관리자 기능에 대한 [../Tutorial2] 문서를 보라.