장고 - django 1.7 tutorial 1 정리
환경 :
참고 : https://docs.djangoproject.com/en/1.7/intro/tutorial01/
Writing your first Django app, part 1
Creating a project
1. 프로젝트를 만들고 싶은 directory 로 이동하여, 다음 명령을 입력한다.
-- Django project 에 필요한 code 를 자동 생성한다.
(* project == a collection of settings for an instance of Django, including database configuration,
Django-specific options and application-specific settings.)
$ django-admin.py startproject mysite
--> 현재 directory 에 mysite 라는 프로젝트이름의 directory 만들어 코드 생성한다.
( 주의: 프로젝트이름을 django 혹은 test 로 하지마라, 이름충돌 발생한다!)
** 아래와 같은 directory 및 file 만들어짐.
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
mysite/ ---> 프로젝트명 폴더
manage.py : command-line utility ---> 서버 기동, 앱 생성 등등 시에 필요.
mysite/ --> project package 이름 폴더
mysite/__init__.py ---> Python package 임을 나타내는 empty file
mysite/settings.py ---> 설정 관련
mysite/urls.py ---> url 관련
mysite/wsgi.py ---> WSGI-compatible web server 에서 웹서비스할때 사용.
Database setup
mysite/settings.py 를 편집하자.
여기에는 장고 설정을 나타내는 변수들(module-level variables)이 있다
기본적으로 SQLite 를 사용한다.
( SQLite 는 python 에 기본 설치되어있어 따로 설치할 필요없다.)
* 다른 database 를 사용하고 싶으면, settings.py 내부의 DATABASES 'default' 항목을 바꾸면 된다.
ENGINE -- 'django.db.backends.sqlite3', 'django.db.backends.postgresql_psycopg2',
'django.db.backends.mysql', 'django.db.backends.oracle' 등등 에서 해당 db로 바꾼다.
NAME -- db 이름. ( SQLite 사용시에는 절대경로 사용하라.)
* SQLite 이외의 db 사용시에는, USER, PASSWORD, HOST 설정도 추가해야함.
참고 : https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-DATABASES
* 주의 : SQLite 이외의 db 사용한다면, 이 시점에서 "CREATE DATABASE database_name;" 와 같은 sql 문으로 database 만들어 놔야함.
-- SQLite 는 자동 생성 하므로 걱정안해도 됨.
* 필요하면 TIME_ZONE 설정하기 -- http://freeprog.tistory.com/25
* INSTALLED_APPS 설정 살펴보기.
-- INSTALLED_APPS ; 장고 프로젝트에서 사용할 모든 Django application 이름으로 구성됨.
- settings.py 내부의 defalult INSTALLED_APPS 설정
django.contrib.admin - 관리자 관련
django.contrib.auth - 인증 관련
django.contrib.contenttypes - content types
django.contrib.sessions - 세션 관련
django.contrib.messages - 메세지 관련
django.contrib.staticfiles - 정적파일 (image, javascript, css) 관련
==> 흔히 사용되는 경우에 편하기위해 default 로 포함되어있음.
-- 이들 apps 중 일부는 db table 을 사용하므로, database 내에 table 생성해야한다!!!!
*** db table 생성하기
-- v1.7 부터 migrate 로 바뀜. (이전까지는 syncdb 명령어 사용함)
$ python manage.py migrate
---> migrate 실행이후에 db.sqlite3 파일 생성과 동시에 내부에 table 10개 생성됨.
(위에서 언급했듯이 migrate 는 table 생성용 !!!!, sqlite 만 특별히 db파일과 table 동시 생성함.)
* migrate 명령어는 INSTALLED_APPS 에 설정된 apps 에 필요한 table 들을, DATABASES 에 설정도 db 를 이용하여 만든다.
The development server
만든 장고 프로젝트 가동시키기...
$ python manage.py runserver
; 장고 내장 개발용 web server 이용하여 기동시킨 것임. 실제 배포시에는 Apache 등 전문 Web server 이용하라!
--> 위 처럼 서버 가동시키고, 웹브라우저에 http://127.0.0.1:8000/ 입력하여 접속한다.
** 장고 서버 구동시 port 사용하기
1) 로컬 컴퓨터에서 8080 포트로 접속하기위한 장고 서버 구동
$ python manage.py runserver 8080
2) 네트워크에서 8080 포트로 접속하기위한 장고 서버 구동
$ python manage.py runserver 0.0.0.0:8000
참고 : https://docs.djangoproject.com/en/1.7/ref/django-admin/#django-admin-runserver
** 장고 서버 구동 상태에서 코드 수정시 자동으로 서버 재구동되어 수정사항 반영한다.
Creating models
Projects vs. apps
app -- web application ( 예: log system, 투표 app 등 )
project -- web site 를 위한 web application 들과 configuration 의 모음.
* project 는 여러개의 apps 을 포함할수있고, app 은 여러 project 에 있을수 있다.
** app 만들기
$ python manage.py startapp polls
--> polls 라는 app 을 만들겠다!
mysite 프로젝트 폴더명 아래에 polls 라는 app 이름의 폴더 생김.
-- polls app 내부에는 migrations 라는 폴더 생김 ( v1.7 부터 생김)
** model 만들기
; model 1개 == database table 1개 라고 생각하면 될듯....
투표앱 (poll app) 에 필요한 2개의 model (table)만들자 ! -- Question, Choice
Qustion = a question + a publication date
Choice = choice + vote tally (투표집계)
- 각각의 Choice 는 한개의 Question 과 연관됨.
* polls/models.py 파일을 아래와 같이 편집하자.
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
각각의 model 은 django.db.models.Model 을 상속받아 만든다.
model 내부의 클래스변수 (class variable) 는 database field 에 해당한다. ( 그러므로, model 은 table 에 해당)
field (클래스변수) 는 Field class 의 instance 이다. ( Field class --> CharField, DateTimeField , etc)
그러므로 Question 클래스에서 question_text, pub_date 는 database column name 으로 사용된다.
CharField 같은 일부 Field class 는 database schema 혹은 유효성(validation) 검사를 위해 argument 가 필요하다.
또 일부 Field class 는 optional argument 를 설정할수있다. ( ex: votes --> default =0 )
관계는 ForeignKey 를 사용하여 정의한다.
장고에서는 many-to-one, many-to-many, one-to-one 의 관계를 제공한다.
Activating models
model 을 가지고
- 투표앱을 위한 database schema (CREATE TABLE statements) 를 생성하고,
- Question, Choice 객체에 접근하기위한 Python database-access API 를 생성한다.
먼저 우리 프로젝트 (mysite) 에 polls 앱이 설치되어있다고 알리는게 필요!
-- 이를위해 mysite/settings.py 파일의 INSTALLED_APPS 설정부분에 'polls' 를 추가한다.
이제 migration 파일을 만들자! ( v1.7 에서 새로 생김, south 기능을 들여옴)
$ python manage.py makemigrations polls
- makemigration ; model 의 변화 사항을 migration 폴더에 python 파일로 저장함.
(위에서는 polls/migrations/ 폴더내에 0001_initial.py 파일이 새로 생김)
- 아직 database 에 model table 생성된것은 아님!!!!
** polls 앱용 table 만들기
$ python manage.py migrate
--> migrate 실행시 migrations 폴더내의 migration 파일을 실행시킨다는 것을 볼수 있다.
- db 파일열어보면 polls_choice 와 polls_ question 이라는 table 이 2개 새로 생김.
(table 명은 'app이름_소문자모델명' 으로 구성된것을 알수있다.)
** 3-step guide
1. model 을 바꾸면 ( models.py )
2. migrations 를 만들기위해, python manage.py makemigrations 실행하고,
3. database 에 적용하기위해, python manage.py migrate 를 실행하면 된다.
참고) Django 1.7 에서 database table 이름 짓는 방법
http://freeprog.tistory.com/50
====================================================================================
이상으로 장고 기본 설정 완료함....
아래부터는 추가 조작 사항들...
=====================================================================================
*** migration 파일 SQL 확인하기
$ python manage.py sqlmigrate polls 0001
--> polls 앱 폴더내 migrations 폴더안에 있는 0001_initial.py 를 SQL 로 표현 출력한다. ????
SQL 문을 실행시키는 것은 아님.
사용하는 database 에 따라 SQL 문은 다를 수 있다.
- Primary key (ID) 는 자동생성됨을 알 수 있다.
- foreign key field name 에는 _id 가 자동 추가됨. ( ex: question_id )
*** Playing with the API
* Django interactive Python shell 실행하기.
-- DJANGO_SETTINGS_MODULE 환경변수 설정하여 사용가능하게 하는 장점이 있어 편하다.
$ python manage.py shell
>>> from polls.models import Question, Choice # 투표 앱 model import
# db 에 저장된 모든 question 출력함. -- 처음 생성시에는 아무것도 없다.
# all() ---> Returns a copy of the current QuerySet (or QuerySet subclass).
# https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.all
# http://stackoverflow.com/a/22806277
>>> Question.objects.all()
[]
>>> from django.utils import timezone # 장고 내장 timezone 이용...
# new Question 생성.
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# database 에 저장
>>> q.save()
# 저장하면서 id 자동 생성됨. db 에 따라 1 or 1L 로 보일수 있다.
>>> q.id
1
# python 속성을 이용하여 model field value 접근
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# 속성을 바꾸후 save() 를 이용하여 원래의 값을 바꿀수 있다.
>>> q.question_text = "What's up?"
>>> q.save()
# objects.all() -- db 에 있는 모든 question 출력함.
>>> Question.objects.all()
[<Question: Question object>] # 가독성 떨어져 보임...
==> 가독성 향상위해 polls/models.py 파일의 model class 에 __unicode__() method 추가한다.
* Django shell 을 다시 시작하여 확인해보자 !
>>> Question.objects.all()
실행했을때, Question object 대신에 해당 내용을 보여주어 가독성 좋아짐....
- polls/models.py 를 아래와 같이 수정 저장해 보자.
*** Djnago python shell 로 이상의 것을 가지고 테스트 해보자!!!
$ python manage.py shell
==> field 검색시에 장고 자체의 Lookup 방법을 따른다.
참고) Field lookups
http://freeprog.tistory.com/49
# Request an ID that doesn't exist, this will raise an exception. >>> Question.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Question 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 Question.objects.get(id=1). >>> Question.objects.get(pk=1) <Question: What's up?> # Make sure our custom method worked. >>> q = Question.objects.get(pk=1) >>> q.was_published_recently() True # Give the Question a couple of Choices. The create call constructs a new # Choice object, does the INSERT statement, adds the choice to the set # of available choices and returns the new Choice object. Django creates # a set to hold the "other side" of a ForeignKey relation # (e.g. a question's choice) which can be accessed via the API. >>> q = Question.objects.get(pk=1) # Display any choices from the related object set -- none so far. >>> q.choice_set.all() [] # Create three choices. >>> q.choice_set.create(choice_text='Not much', votes=0) <Choice: Not much> >>> q.choice_set.create(choice_text='The sky', votes=0) <Choice: The sky> >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0) # Choice objects have API access to their related Question objects. >>> c.question <Question: What's up?> # And vice versa: Question objects get access to Choice objects. >>> q.choice_set.all() [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] >>> q.choice_set.count() 3 # The API automatically follows relationships as far as you need. # Use double underscores to separate relationships. # This works as many levels deep as you want; there's no limit. # Find all Choices for any question whose pub_date is in this year # (reusing the 'current_year' variable we created above). >>> Choice.objects.filter(question__pub_date__year=current_year) [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] # Let's delete one of the choices. Use delete() for that. >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()
참고) Manager 명명법 ; _set 사용법
http://freeprog.tistory.com/55
'python' 카테고리의 다른 글
nitrous.io 에서 django 서비스 하기 (0) | 2014.10.16 |
---|---|
cloud.biopython.net 에서 Django 서비스 실행하기 (0) | 2014.10.14 |
django 설치, 버전 확인 (0) | 2014.10.14 |
python -- ffmpeg 이용한 video, audio capture (1) | 2014.09.30 |
beautiful Soup, PhantomJS 사용한 javacript web scraping ( pubmed ) (1) | 2014.09.24 |