Django tutorial1

[markdown]
#django 튜토리얼1

###쟝고의 기능들
– ORMapper
– Automatic admin interface
– Elegant URL design
– Template system
– cache system
– Internationalization

###쟝고 설치됐는지 확인하기

`python -c “import django; print(django.get_version())”`

###project 만들기

`django-admin.py startproject mysite`

위에꺼 실행하면 아래와 같은 디렉토리 & 파일이 생성됨

“`shell
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
“`

– manage.py : 커맨드라인 유틸리티. 자세한 것은 다음링크에서 확인가능 [django-admin.py and manage.py](https://docs.djangoproject.com/en/1.6/ref/django-admin/)
– mysite 디렉토리 안의 mysite : 디렉토리가 실제 만들게될 프로젝트의 디렉토리
– mysite/settings.py : 쟝고프로젝트 설정파일. 자세한 것은 다음 링크에서 [Django settings](https://docs.djangoproject.com/en/1.6/topics/settings/)
– mysite/urls.py : 쟝고프로젝트의 URL정의 파일. 자세한 것은 다음 링크에서 확인 [URL dispatcher](https://docs.djangoproject.com/en/1.6/topics/http/urls/)
– mysite/wsgi.py : WSGI과 호환되는 웹서버의 시작점. 자세한 것은 다음 링크로 [How to deploy with WSGI](https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/)

##### 서버기동
`python manage.py runserver`

##### 데이터베이스 세팅
디폴트는 sqlite3이고, 다른 데이터베이스를 사용하려면 mysite/settings.py의 `DATABASES` 부분을 수정해주어야한다. (나는 mongodb쓸껀데…) 데이터베이스 세팅에 관한 내용은 다음 링크에 있음 [setting-DATABASE-ENGINE](https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-DATABASE-ENGINE)

##### 타임존 설정(TIME_ZONE)
나는 대한민국 사람이니 mysite/settings.py 의 TIME_ZONE을 ‘Asia/Seoul’로 변경함. 기본은 ‘America/Chicago’
언어는 귀찮아서 냅둠.

##### 설치된 앱들

settings.py에 보면 INSTALLED_APPS라는 파라메터가 있는데, 현재의 쟝고 인스턴스에서 활성화 된 쟝고 어플리케이션의 이름들을 적어놓은 곳이다. APP은 여러 프로젝트에서 사용가능하고 패키징하고 배포가 가능해서 다른 프로젝트에서도 사용될 수 있다.

디폴트로 포함되어 있는 앱들

– django.contrib.admin – 관리자페이지
– django.contrib.auth – 인증시스템
– django.contrib.contenttypes – 컨텐트타입 프레임웤
– django.contrib.sessions – 세션 프레임웤
– django.contrib.messages – 메세징 프레임웤
– django.contrib.staticfiles – 정적파일을 위한 프레임웤

##### syncdb
`$ python manage.py syncdb`

syncdb 커맨드는 INSTALLED_APPS의 설정을 보고 필요한 데이터베이스 테이블을 생성한다.
처음 실행할때 admin유저를 만들 수 있다.

##### app 만들기
`python manage.py startapp polls`

mysite의 탑레벨 모듈로 polls모듈을 만들자.

디렉토리는 아래와 같이 생겼다.

“`shell
polls/
__init__.py
admin.py
models.py
tests.py
views.py
“`

##### 모델만들기

polls/models.py 를 아래와 같이 고친다.

“`python
from django.db import models

class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField(‘date published’)

class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
“`

하나의 클래스는 테이블과 매핑되고 하나의 변수는 하나의 필드와 매핑이 된다. 그리고 Choice클래스에 외래키를 지정했는데 django는 관계형디비의 모든 관계(다대다 일대다 일대일)를 지원한다.

##### 모델 활성화하기

mysite/settings.py의 파일을 다시 열어서 아래와 같이 수정한다.

“`python
INSTALLED_APPS = (
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘polls’,
)
“`

이제 쟝고가 polls앱이 포함된 것을 알게됐다. 다음으로 아래의 명령을 실행해보자.

`$ python manage.py sql polls`

그러면 아래와 같은 SQL문이 콘솔에 찍힌다.

“`sql
BEGIN;
CREATE TABLE “polls_poll” (
“id” integer NOT NULL PRIMARY KEY,
“question” varchar(200) NOT NULL,
“pub_data” datetime NOT NULL
)
;
CREATE TABLE “polls_choice” (
“id” integer NOT NULL PRIMARY KEY,
“poll_id” integer NOT NULL REFERENCES “polls_poll” (“id”),
“choice_text” varchar(200) NOT NULL,
“votes” integer NOT NULL
)
;
“`

– 콘솔에 찍힌 SQL은 우리가 지정한 혹은 기본인 sqlite3 데이터 베이스에 사용되는 SQL문임을 알 수 있다.
– 테이블명은 자동적으로 app(polls)과 소문자 모델클래스명을 결합하여 만들어진다.
– 프라이머리키(IDs)는 자동으로 추가된다. (오버라이딩 가능)
– 관례로, 쟝고는 ‘_id’를 외래키명에 붙인다.
– 외래키 관계는 REFFERNCE문으로 정확히 만들어졌다.
– `sql`명령어는 실제로 SQL을 실행하지는 않고 단순히 출력만 해준다.

관심있으면 아래 명령어도 테스트해보길

– python manage.py validate – 모델이 유효한지 체크해줌
– python manage.py sqlcustom polls – 테이블 변경이나 제약수정을 위한 명령어를 출력
– python manage.py sqlclear polls – 테이블 삭제를 위한 쿼리를 출력
– python manage.py sqlindexes polls – 인덱스 생성문을 출력
– python manage.py sqlall polls – 해당앱에 사용된 모든 쿼리를 합쳐서 출력

`syncdb`로 모델의 테이블을 생성하자! (syncdb는 create만 해주고 alter는 해주지 않는다. 만약에 컬럼명이 변경된 경우 수동으로 고쳐야함)

### API로 놀기

`$ python manage.py shell` managy.py가 DJANGO_SETTINGS_MODULE의 환경을 세팅해줌

“`python
>>> from polls.models import Poll, Choice
>>> Poll.objects.all()
[]

>>> from django.utils import timezone
>>> p = Poll(question=”What’s new?”, pub_date=timezone.now())
>>> p.save()
>>> p.id
1

>>> p.question
“What’s new?”
>>> p.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=)

>>> p.question = “What’s up?”
>>> p.save()

>>> Poll.objects.all()
[]
“`

마지막에 Poll object라고 나온거는 전혀 도움이 안되니 도움이 되는 문자열로 만들어보자.

polls/models.py 에 다음과 같은 메서드를 추가해주면 됨

“`python
from django.db import models

class Poll(models.Model):
# …
def __unicode__(self): # Python 3: def __str__(self):
return self.question

class Choice(models.Model):
# …
def __unicode__(self): # Python 3: def __str__(self):
return self.choice_text
“`

메서드 하나를 또 추가해보자

“`python
import datetime
from django.utils import timezone
# …
class Poll(models.Model):
# …
def was_published_recently(self):
return self.pub_date >= timezone.now() – datetime.timedelta(days=1)
“`

`python manage.py shell`을 다시실행해서 놀아보자

“`python
>>> from polls.models import Poll, Choice

# Make sure our __unicode__() addition worked.
>>> Poll.objects.all()
[]

>>> Poll.objects.filter(id=1)
[]
>>> Poll.objects.filter(question__startswith=’What’)
[]

# Get the poll that was published this year.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Poll.objects.get(pub_date__year=current_year)

# Request an ID that doesn’t exist, this will raise an exception.
>>> Poll.objects.get(id=2)
Traceback (most recent call last):

DoesNotExist: Poll matching query does not exist.

# Lookup by a primary key is the most common case, so Django provides a
# shortcut for primary-key exact lookups.
# The following is identical to Poll.objects.get(id=1).
>>> Poll.objects.get(pk=1)

>>> p = Poll.objects.get(pk=1)
>>> p.was_published_recently()
True

>>> p = Poll.objects.get(pk=1)

>>> p.choice_set.all()
[]

>>> p.choice_set.create(choice_text=’Not much’, votes=0)

>>> p.choice_set.create(choice_text=’The sky’, votes=0)

>>> c = p.choice_set.create(choice_text=’Just hacking again’, votes=0)

>>> c.poll

>>> p.choice_set.all()
[, , ]
>>> p.choice_set.count()
3

>>> Choice.objects.filter(poll__pub_date__year=current_year)
[, , ]

>>> c = p.choice_set.filter(choice_text__startswith=’Just hacking’)
>>> c.delete()
“`

여기까지 했으면 인제 파트2로 넘어가도 됨. (튜토리얼은 6개까지 있음)
[/markdown]

맥에서 쟝고개발환경 만들기 (Django, pip, virtualenv and homebrew)

이번에 맥북을 사면서 파이썬 개발환경을 구축했습니다.
구축하는 중에 정리한 내용을 공유합니다.

아래 링크에서 거의 대부분 참고 했습니다.
http://www.tlswebsolutions.com/mac-os-x-lion-setting-up-django-pip-virtualenv-and-homebrew/
따라하는 겸 저도 따로 정리했습니다.(대부분 비슷한데 약간 다릅니다.)
위 링크에는 xcode대신에 gcc를 설치하는데요, 저는 xcode가 설치된 상태였기에 gcc를 설치하지 않았습니다.
xcode를 설치하지 않으신 분들중에 제대로 안되시는 분들은 알려주시면 감사드리겠습니다~

업데이트가 필요해진 부분들도 새로 정리했으니 영어가 귀찮은신분들은 참고하시면 좋을것 같아요.
설치하게 될 라이브러리, 프레임웤은 아래와 같습니다.

  • Pyhon2.7
  • Django1.3
  • Git
  • Homebrew > 맥 OSX의 패키지 관리자
  • xcode Command Line Tools
  • Pip -> package install for python
  • PIL -> python imaging library
  • Virtualenv -> 파이썬의 버추얼 환경을 위한 프로그램

homebrew 설치하기

homebrew설치는 아래 사이트에서 확인가능하십니다.
http://mxcl.github.com/homebrew/

아래와 같이 쉡에 입력하시면 homebrew의 설치는 끝납니다.
매우 간단하죠? ^^

$ ruby -e “$(curl -fsSkL raw.github.com/mxcl/homebrew/go)”

설치중 아래와 같은 경고가 떠서
Warning: Install the “Command Line Tools for Xcode”: http://connect.apple.com

애플 디벨로퍼 사이트에 가서 Command Line Tools 를 다운로드 받았습니다.  (용량이 110메가!)

https://developer.apple.com/downloads/index.action

다운로드 하는 동안 brew가 잘 되는지 확인 해보죠.

아래와 같이 입력합니다.

$ brew

터미널에 사용법이 찍혀 나온다면 성공한것입니다.

git인스톨하기

이제 본젹적으로 brew를 이용해서 인스톨을 해보아요.
먼저 git을 설치해보겠습니다.

$ brew install git

인스톨하는데 아래와 같은 에러가 떳습니다.

Warning: You have not agreed to the Xcode license.

xcode를 한번도 실행하지 않아서 뜨는 에러인것 같아서
xcode를 실행하니 라이센스에 동의하라고 나옴니다.
이거구나 싶군요!
‘동의’를 누르니 개발자 툴 다운받을래? 라고 뜹니다.
받는다고 설정하고 다운로드를 완료했습니다.
xcode설정하는 중에 git도 설치가 완료 됐군요!

git도 테스트 해보겠습니다.

$ git help

해서 사용법이 주르륵~~ 나오면 잘 되는 것입니다.

이제 파이썬을 설치해 봅시다.
아래 커맨드는 파이썬에서 필요한 라이브러리들을 설치하는 커맨드입니다.

$ brew install readline sqlite gdbm

이제 파이썬을 설치해보아요.

$ brew install python –universal –framework

–universal과 –framework 옵션은 제가 대충만 찾아봐서 확실히 알지는 못하오니 궁금하시다면,

homebrew python formula로 구글에서 검색해보시길 바랍니다.

그 와중에 xcode Command Line Tools의 다운로드가 끝났네요.

xcode Command Line Tools를 설치해보죠~

xcode Command Line Tools를 설치

다운로드 받으신 파일(아래와 같은 파일이요.)을 더블클릭하시면 창이뜹니다.

그리고, 아래와 같은 화면에서 ‘계속’등등을 누르셔서 그저 다음으로 넘어가시기만 하면 됩니다.

너무 간단하네요. ^^;

이제 파이썬의 패키지 관리를 해야하니 pip를 설치해봐요.

$ easy_install pip

실행중에 에러가 났습니다. 권한이 없다고 나오는군요.
[Errno 13] Permission denied: ‘/Library/Python/2.7/site-packages/test-easy-install-42582.write-test’

관리자 권한으로 실행을 해야될 것 같네요.
관리자 권한을 활성화 시키는 법은 아래 링크를 참고하세요~

http://support.apple.com/kb/HT1528?viewlocale=ko_KR&locale=ko_KR 

관리자 권한을 활성화 시키셨으면 다시 pip를 설치해봅시다.

관리자 권한으로 실행가능하도록 sudo를 사용하겠습니다.

$ sudo easy_install pip

이제 pip로 파이썬의 패키지들을 인스톨 할 수 있습니다.
python가상환경을 만들어주는 virtualenv를 설치해봐요.

virtualenv설치

Virtualenv는 파이썬 개발에 필요한 환경을 맥 머신에 기본 설치되어 있는
파이썬 환경과는 별도의 환경으로 완전히 구별하고 싶을때 사용합니다. (영어로는 고립시킨다고 되어있네요.)

아래 명령을 실행시켜 봅시다.(역시 관리자 권한이 필요합니다. ㅎ)

$ sudo pip install virtualenv

자, 이제 장고를 실행시키기위한 환경을 구축해봐요.

프로젝트의 루트로 사용할 디렉토리를 하나 만드셔야 됩니다.

$ mkdir directory_name

$ cd directory_name

그리고 새로운 버추얼 환경을 만들어 봅시다.

$ virtualenv [버추얼환경 이름] –no-site-packages

아래 커맨드로 새로운 버추얼 환경을 실행할 수 있습니다.

$ source [버추얼환경 이름]/bin/activate

이렇게 하시면 터미널의 앞에 버추얼 환경의 이름이 나오게 됩니다.

저는 django라고 이름을 지었는데요, 이런식으로 나옵니다.

(django) user $ _

버추얼 환경에서 나오시려면 아래의 커맨드를 입력하세요.

$ deactivate

마지막으로 쟝고를 설치해보겠습니다~

$ pip install django

이제 쟝고개발환경이 다 준비되었습니다! 와우!

만약에 MySQL을 지원하고 싶으시다면 MySQL서버와 MySQL-python라이브러리를 설치해야해요.

아래의 명령어로 간단히 가능합니다. (brew를 실행해야하니 버추얼 환경에서 나와주세요.)

brew install mysql

#아래 두줄은 붙여서 써주세요~
sudo pip install http://downloads.sourceforge.net/project/mysql-python/mysql-python-test/1.2.3c1/MySQL-python-1.2.3c1.tar.gz?use_mirror=cdnetworks-us-2

PIL이라는 파이썬 이미지 라이브러리도 설치해봅시다.

pip install PIL

이제 필요한 것은 다 준비 되었습니다.

쟝고프로젝트를 개발하실 수 있습니다.

버추얼 환경으로 설치했기에 기존의 맥 환경에는 전혀 영향을 주지 않습니다~!

이제 쟝고 프로젝트를 시작하는 것만 남았군요!

버추얼 환경으로 들어가셔서 쟝고 프로젝트를 생성하는데 까지 해보겠습니다.

source django/bin/activate

쟝고 프로젝트를 생성하는 커맨드는 아래와 같습니다.

django-admin.py startproject project_name

project_name에는 여러분이 만드실 프로젝트명을 넣으세요~ ^^

아..그리고 한가지 빼먹게 있습니다만, mysql설정인데요.

mysql설정은 따로 해주셔야됩니다. 다른 좋은 분들의 링크만 소개하겠습니다.
(저는 공식사이트가 젤 낫긴 하더라구요.)

그럼 재미나는 프로그래밍 하시길 바랍니다. ^^

http://dev.mysql.com/doc/refman/5.6/en/binary-installation.html

http://calflove.tistory.com/334

http://bluexmas.tistory.com/216

덧, 버추얼 환경이라고 하니 용어가 조금 헷갈립니다만,
nodejs나 루비를 아시는 분들이라면 nodejs의 nvm 이나 ruby의 rvm을 생각하시면 좀 더 이해하기 쉬울것 같습니다.
virtualenv는 nvm또는 rvm이 하는 역활들을 해주는 녀석입니다.
각 버전별로 패키지를 따로 설정할 수 있는데요. 가상 환경 이름을 붙이기에 같은 버전이라도
얼마든지 용도에 따라 만들 수 있습니다.