Django

카테고리 없음 2011. 6. 18. 19:11

Django프로젝트시작

Django 프로젝트 시작

초기 프로젝트 생성

  • mkdir 프로젝트Dir
  • cd 프로젝트Dir
  • django-admin.py startproject 프로젝트이름
    • 프로젝트 이름은 Django나 Python 기본 패키지 이름과 겹치게 해서는 안된다.
  • Django 프로젝트 소스 파일들은 Web Root 가 아닌 다른 디렉토리에 두도록 한다. Web Root에 두면 보안상 좋지 않다.

 

생성된 파일 설명

  • __init__.py : 현재 디렉토리가 파이선 패키지 임을 나타내는 파일
  • manage.py : Django 프로젝트를 관리하는 명령행 유틸리티
  • settings.py : 프로젝트 설정 파일
  • urls.py : URL 설정

 

서버 시작

  • Django 내장 개발 서버가 있다.
  • 이 내장 서버는 개발용이다. 실 운영시에는 사용하지 말라.
  • 일단 최초에 한 번 : chmod +x manage.py
  • 서버 실행 : manage.py runserver
    • Development server is running at http://127.0.0.1:8000/ : 서버의 주소와 포트를 보여준다.
    • 이 주소에 접속해 보면 파란 환영 메시지를 볼 수 있다.
    • manage.py runserver 다른포트 : 포트 번호 바꿔서 실행

 

데이터베이스 설정

  • settings.py 에 설정
  • DATABASE_ENGINE : 데이터베이스 종류. postgresql_psycopg2, mysql, sqlite3, ...
  • DATABASE_NAME : 데이터베이스 이름. SQLite의 경우에는 파일 경로.
  • DATABASE_USER : 사용자명
  • DATABASE_PASSWORD : 비밀번호
  • DATABASE_HOST : 호스트명
  • DATABASE_PORT : DB 포트
  • INSTALLED_APP 변수에는 이 Django 인스턴스에 설치된 Django 애플리케이션 목록을 설정한다. 기본 설정 사항을 데이터베이스를 사용해야만 하게 되어 있다. 이 변수에 기본 설정되어 있는 값들은, 보편적인 애플리케이션을 우한 예제로, 굳이 이걸 사용할 필요는 없다. 필요 없으면 그 줄은 삭제해도 된다.
  • 데이터베이스 싱크 맞추기(테이블 자동생성) : manage.py syncdb
    • settings.py에 설정해둔 DB 사용.
    • INSTALLED_APPS 를 확인하고 테이블을 자동 생성한다.
    • 관리자(superuser) 계정을 만들라고 하면 만든다.
    • syncdb는 오직 INSTALLED_APPS에 있는 항목들에 대해서만 테이블을 생성한다.

 

모델 생성하기

  • 애플리케이션을 생성한다.
    • cd mysite : mysite는 프로젝트이다.
    • manage.py startapp polls : polls는 애플리케이션이다.
  • polls 디렉토리가 생성되고 기본적인 파일들이 생성된다.
  • 모델(Model)이란 데이터에 관해 정의하는 소스이다. 데이터의 필드와 행위 등을 여기에 코딩한다.
  • models.py 에 모델 클래스들을 코딩한다.
  • 모델 클래스는 django.db.models.Model 클래스를 상속받는다.
    • class Poll(models.Model)
  • 모델의 각 필드는 데이터베이스의 칼럼을 의미한다. 모델의 필드 이름은 데이터베이스와 Python 모두 인지할 수 있는 문자들을 사용해서 지어야 한다.
  • 각 필드는 models.*Field 클래스의 인스턴스이다. (예: models.CharField 문자열 필드, models.DateTimeField : 시간 필드)
  • models.ForeignKey 필드는 외래키를 의미한다. Django는 many-to-many, many-to-one, one-to-one을 지원한다.
  • 모델 클래스 생성시 첫번째 인자로 문자열을 주어서 사람이 읽을 수 있는 설명을 붙여도 된다.
  • def __str__(self) 메소드를 생성해 주면, 객체의 이름이 필요할 때 __str__메소드의 실행 결과가 출력된다.

 

모델 활성화

  • 테이블 스키마를 생성하고, Python 테이블 접근 API를 생성해야 한다.
  • settings.py 에서 INSTALLED_APP에 'mysite.polls' 추가
  • manage.py sql polls : polls 애플리케이션 모델들의 테이블을 생성하는 SQL DDL를 출력한다. 테이블을 실제로 생성하지는 않는다.
  • manage.py validate polls : polls 애플리케이션 모델들이 제대로 작성되었는지 확인한다.
  • manage.py sqlcustom polls : polls 애플리케이션의 사용자정의 SQL DDL 문을 출력한다.
  • manage.py sqlclear polls : polls 애플리케이션의 테이블을 삭제하는 SQL을 출력한다.
  • manage.py sqlindexes polls : polls 애플리케이션의 CREATE INDEX 를 출력한다.
  • manage.py sqlall polls : polls 애플리케이션의 sql, sqlcustom, sqlindexes 를 실행한 결과를 조합해서 보여준다.
  • manage.py syncdb
    • 실행하면 생성될 필요가 있는 나머지 테이블들이 모두 생성된다.
    • manage.py sqlall 을 실행했을 때 나오는 구문들을 진짜로 실행한다.
    • INSTALLED_APPS에 있는 애플리케이션들의 테이블 중에서 데이터베이스에 "존재하지 않는 테이블"들만을 생성하는 것이다.
    • syncdb는 원하는 대로 언제든지 호출해도 된다.

 

Django Interactive Shell

manage.py shell 를 실행하여 인터랙티브 셸을 실행할 수 있다. manage.py 가 현재 애플리케이션에 관련된 아래 사항들을 자동으로 설정하고서 python 셸을 실행해준다.

  • 현재 프로젝트를 sys.path에 넣어준다.
  • DJANGO_SETTINGS_MODULE 환경변수를 설정해준다. : Django에게 settings.py 파일의 경로가 어디인지 알려준다.
  • 다음과 같이 실행해서 셸 상에서 모델들을 다룰 수 있다.
    • from mysite.polls.models import Poll, Choice
    • Poll.objects.all()
    • from datetime import datetime
    • p = Poll(question="What's up?", pub_date=datetime.now())
    • p.save() # Create
    • p.id
    • p.question
    • p.pub_date
    • p.pub_date = datetime(2005, 4, 1, 0, 0)
    • p.save() # Update
  • 조건 줘서 객체 가져오기
    • Poll.objects.all() : 모두 가져오기
    • Poll.objects.filter(id=1) : id = 1 인 것만
    • Poll.objects.get(id=1) : id = 1 인 것만
    • Poll.objects.get(pub_date__year=2005) : pub_date의 year가 2005인 것만
    • Poll.objects.get(pk=1) : 이것은 Poll.objects.get(id=1)과 동일한것이다.
    • p = Poll.objects.get(pk=1)
    • p.choice_set.create(choice='Not much', votes=0)  : Choice 객체 생성해서 Poll 객체에 연결
    • p.choice_set.create(choice='The sky', votes=0)
    • c = p.choice_set.create(choice='Just hacking again', votes=0)
    • c.poll : 외래키 Poll 객체
    • p.choice_set.all() : 해당 Poll 객체가 소유하고 있는 모든 Choice 객체들
    • p.choice_set.count() : 해당 Poll 객체가 소유하고 있는 모든 Choice 객체의 개수
    • c = p.choice_set.filter(choice_startswith='Just hacking') : choice 필드가 Just hacking으로 시작하는 choice 객체 선택
    • c.delete() : 삭제
Posted by osar
,