Django 버전 확인
$ python -m django --version
- django 설치 후 django의 버전을 확인하는 명령어
프로젝트 만들기
$ django-admin startproject mysite
- mysite라는 프로젝트 디렉토리를 생성한다는 뜻
- 프로젝트를 생성할 때, Python이나 Django에서 사용 중인 이름은 피해야한다.
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
- 프로젝트 디렉토리를 생성했을 때 디렉토리 안에는 이런 구조로 디렉토리와 파일이 생성되게 된다.
- mysite/
- manage.py
- 프로젝트와 다양한 방법으로 상호작용하는 유틸리티
- 유틸리티 : 컴퓨터 하드웨어, 운영 체제, 응용 소프트웨어를 관리하는 데 도움을 주도록 설계된 프로그램
- mysite/
- 이 디렉토리의 내부에는 프로젝트를 위한 실제 Python 패키지(package)들이 저장된다.
- 이 디렉토리 내의 이름을 이용하여, 프로젝트의 어디서나 Python 패키지들을 import 할 수 있다.
- mysite/init.py
- Python으로 하여금 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일
- mysite/settings.py
- 현재 Django 프로젝트의 환경 및 구성을 저장한다.
- mysite/urls.py
- 현재 Django 프로젝트의 URL 선언을 저장한다.
- Django로 작성된 사이트의 목차라고 할 수 있다.
- mysite/asgi.py
- 현재 프로젝트를 서비스 하기 위한 ASGI 호환 웹 서버의 진입점
- mysite/wsgi.py
- 현재 프로젝트를 서비스 하기 위한 WSGI 호환 웹 서버의 진입점
- asgi, wsgi란
- django는 웹 프레임워크일 뿐이므로 작동하기 위해 웹 서버가 필요하다. 하지만 대부분의 웹 서버는 기본적으로 Python을 이용하지 않는다.
- Python과 웹 서버 사이에서 커뮤니케이션을 이루어줄 인터페이스가 필요하다.
- 인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다.
- 그 인터페이스가 되어주는 것이 ASGI, WSGI이다.
개발 서버 생성
$ python manage.py runserver
- Django 개발 서버를 시작한다는 뜻
- 서버가 동작하면, 주소를 통해 서버에 접속할 수 있다.
앱 만들기
- Django 앱이란 Django에서 사용하는 파이썬 패키지이다.
- Django App은 자신의 모델, 뷰, 템플릿, URL 등을 독자적으로 가지고 있다.
- App은 특정한 기능을 수행하는 웹 어플리케이션을 말한다.
- 프로젝트는 이러한 app들과 각 설정을 모아둔 것이다.
- 하나의 Django 프로젝트는 다수의 app을 포함할 수 있고, app은 다수의 project에 포함될 수 있다.
$ python manage.py startapp polls
- 앱을 생성하기 위해 manage.py 가 존재하는 디렉토리에서 위의 명령어를 입력한다.
- 명령어를 입력하면 polls라는 디렉토리가 생긴다.
- Django는 앱(app)의 기본 디렉토리 구조를 자동으로 생성할 수 있는 도구를 제공한다.
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
- polls 디렉토리안의 구조이다.
- 이 디렉토리 구조는 app의 집이 되어줄 것이다.
뷰 작성하기
- 여기서 view 란 django에서 로직을 처리하는 공간이다.
polls/view.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
- polls/view.py 파일을 열어 위와 같은 파이썬 코드를 입력한다.
- 위의 코드는 Django에서 가장 간단한 형태의 뷰이다.
- 뷰를 호출하려면 뷰와 연결된 URL이 있어야 하는데, 이를 위해 URLconf가 사용된다.
- URLconf를 생성하려면 urls.py라는 파일을 생성해야 한다.
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
polls/url.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
- 처음 프로젝트를 생성할 때 mysite/ 디렉토리 안에 생성되었던 최상위 URLconf 파일에서 polls.url 모듈을 바라보게 설정한다.
- mysite/urls.py 파일을 열고, django.urls.include를 import하고, urlpatterns 리스트에 include() 함수를 다음과 같이 추가한다.
- include() 함수
- include() 함수는 다른 URLconf들을 참조할 수 있도록 도와준다.
- Django가 함수 include()를 만나게 되면, URL의 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include된 URLconf로 전달한다.
- include()의 숨은 아이디어 덕분에 URL을 쉽게 연결할 수 있다.
- 언제 include()를 사용하나요?
- 다른 URL 패턴을 포함할 때마다 항상 include()를 사용해야 한다.
- admin.site.urls가 유일한 예외이다.
아직은 view파일의 코드를 완벽하게 이해하지 않아도 된다. 전체적인 흐름만 파악해보자.
$ python manage.py runserver
- 이제 index뷰가 URLconf에 연결되었다.
- 위의 명령을 입력하면 브라우저에서 http://localhost.8000/polls/ 를 입력하면 index 뷰에서 정의한 'Hello, world. You're at the polls index.'가 보일 것이다.
- URLconf 파일은 서버에서 사용자가 요청을 보냈을 때, 사용자의 요청이 무슨 요청인지 판단한 후 view에서 요청과 맞는 코드를 연결해주는 역할을 한다.
- 서버에서 '1'이라는 요청을 보냈다면, URLconf는 '1'이라는 요청을 View 파일에서 찾아주는 역할을 한다.
데이터 베이스 설치
# Application definition
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
- mysite/settings.py 파일은 Django 설정을 모듈 변수로 표현한 Python 모듈이다.
- 위는 mysite/settings.py 파일의 코드 중 일부이다.
- INSTALLED_APPS
- 현재 Django 인스턴스에서 활성화된 모든 Django 어플리케이션들의 이름이 담겨 있다.
- 앱들은 다수의 프로젝트에서 사용될 수 있고, 다른 프로젝트에서 쉽게 사용될 수 있도록 패키징하여 배표할 수 있다.
- django.contrib.admin
- django.contrib.auth
- django.contrib.contenttypes
- django.contrib.sessions
- django.contrib.messages
- django.contrib.staticfiles
- 위 어플리케이션들은 일반적인 경우에 사용하기 편리하도록 기본으로 제공된다.
- 이러한 기본 어플리케이션들 중 몇몇은 최소한 하나 이상의 데이터베이스 테이블을 사용하는데, 그러기 위해서는 데이터베이스에서 테이블을 미리 만들 필요가 있다.
$ python manage.py migrate
- 위 명령어를 실행하면 데이터베이스에서 테이블이 미리 만들어진다.
모델 만들기
- 모델이란 부가적인 메타데이터를 가진 데이터베이스의 구조를 말한다.
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, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
- 데이터베이스의 각 필드는 Field 클래스의 인스턴스로서 표현된다.
- CharField 는 문자(character) 필드를 표현한다.
- DataTimeField 는 날짜와 시간(datetime) 필드를 표현한다.
- 이것은 각 필드가 어떤 자료형을 가질 수 있는지를 Django에게 말해준다.
- 각 Field의 인스턴스의 이름은 기계가 읽기 좋은 형식의 데이터베이스 필드 이름이다. (ex. question-text, pub_date)
- 이 필드명을 Python 코드에서 사용할 수 있으며, 데이터베이스에서는 칼럼명으로 사용한다.
- ForeignKey
- 위 예제에서는 각각의 Choice가 하나의 Question에 관계된다는 것을 Django에게 알려준다.
- Django는 다:1(many-to-one), 다:다(many-to-many), 1:1(one-to-one)과 같은 모든 데이터베이스의 관계들을 지원한다.
모델 활성화
- 모델에 대한 이 작은 코드가 Django에게는 상당한 양의 정보를 전달한다. 장고는 정보를 가지고 어떤 일을 할 수 있다.
- 이 앱을 위한 데이터베이스 스키마 생성(CREATE TABLE 문)
스키마
- 스키마는 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터(다른 데이터를 구조화한 데이터)의 집합이다.
- 스키마는 데이터베이스를 구성하는 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및 데이터 조작 시 데이터 값들이 갖는 제약 조건 등에 관해 전반적으로 정의한다.
- 스키마는 사용자의 관점에 따라 외부 스키마, 개념 스키마, 내부 스키마로 나눠진다.
- Question과 Choice 객체에 접근하기 위한 Python 데이터베이스 접근 API를 생성
- API는 서버와 데이터베이스에 대한 출입구 역할을 한다
mysite/settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
- 현재 프로젝트에게 polls 앱이 설치되어 있다는 것을 알린다.
- 앱을 현재 프로젝트에 포함시키기 위해서는, 앱의 구성 클래스에 대한 참조를 INSTALLED_APPS 설정에 추가해야한다.
- Polls.Config 클래스는 polls/apps.py 파일 내에 존재한다.
$ python manage.py makemigrations polls
- makemigrations을 실행시킴으로서, 모델을 변경한 사실과 이 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 알린다.
$ python manage.py sqlmigrate polls 0001
- migration을 실행시켜주고, 자동으로 데이터베이스 스키마를 관리해주는 migrate 명령어가 있다.
- 위 명령어는 migration이 어떤 SQL 문장을 실행하는 지 알수 있게 한다.
- sqlmigrate 명령은 migration 이름을 인수로 받아, 실행하는 SQL 문장을 보여준다.
$ python manage.py shell
- 위 명령어를 통해 Python 쉘로 진입하여 Django API를 자유롭게 사용할 수 있다.
view 추가
- 뷰는 Django 어플리케이션이 일반적으로 특정 기능과 템플릿을 제공하는 웹페이지의 한 종류다
- 블로그의 경우 가질 수 있는 뷰
- Blog 홈페이지
- 세부 페이지
- 댓글 기능
- ...
<참고>