본 문서는 패스트캠퍼스 ‘Web-Programming School’ 수업 자료를 바탕으로 작성되었습니다.
장고걸스 페이지를 참고하였습니다.
Ubuntu 16.04 환경
Django 2.0 환경
가상환경 설정
$pyenv virtualenv 3.6.4 fc-djangogirls
$pyenv logcal fc-djangogirls
$git init
$vim .gitignore
// gitignore.io 사이트에서 환경설정에 지정해서 복붙
pycharm - setting - project interpreter - fc-dajangogirls로 설정
git status
로 .idea/ 폴더 있는지 확인 후, 연결 된 Git Repository에 commit!
장고 설치
$pip install django
Collecting django
Using cached Django-2.0.1-py3-none-any.whl
Collecting pytz (from django)
Using cached pytz-2017.3-py2.py3-none-any.whl
Installing collected packages: pytz, django
Successfully installed django-2.0.1 pytz-2017.3
Django란?
Django는 파이썬으로 만들어진 무료 오픈소스 웹 애플리케이션 프레임워크
서버와 웹페이지 동작 방식
- 브라우저에서 HTTP 요청 -> DNS -> IP -> request -> 서버컴퓨터에 도착
- 서버컴퓨터의 웹 서버 프로그램이 해당 요청을 받음
- 웹 서버 프로그램은 웹 애플리케이션에 요청에 대한 응답의 제작을 요청
- 웹 애플리케이션은 요청에 대한 응답을 동적으로 생성해서 웹 서버에게 돌려줌
- 웹 서버는 자신이 요청하고 받은 응답을 다시 사용자에게 전송
- 브라우저에 전송
나의 첫 번째 장고 프로젝트!
Note 이 장의 일부는 Geek Girls Carrots (http://django.carrots.pl/)의 튜토리얼을 기초로 작성되었습니다.
Note 이 장의 일부는 Creative Commons Attribution-ShareAlike 4.0 International License에 준수하여 django-marcador 튜토리얼를 기초로 작성되었습니다. django-marcador 튜토리얼 저작권은 Markus Zapke-Gründemann et al이 소유하고 있습니다.
프로젝트 만들기
Django project 를 구성하는 코드를 자동 생성하며 이 과정에서 데이터베이스 설정, 옵션, 어플리케이션을 위한 설정과 관련된 Django인스턴스를 구성하기 때문에 초기 설정 주의
$django-admin startproject mysite
현재 디렉토리에서 mysite라는 디렉토리 생성
└── mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
tree
로 확인한 디렉토리 구조
mysite - mystie 디렉토리의 경우, setting 관련한 디렉토리이므로 config 로 디렉토리명 변경
mysite 디렉토리 이름도 알기 쉽게 Django 로 변경
Django
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Django 디렉토리 Source root 로 설정 (Pycharm에서 디렉토리가 파란색으로 변함)
- manage.py : Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티
- settings.py : project 환경/구성 저장
- urls.py : 현재 Django project의 url선언 저장.
설정 변경
config/seetings.py 변경
<!-- config/seetings.py -->
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'Ko-kr'
TIME_ZONE = 'Asia/Seoul'
TIME_ZONE 은 국제표준 UTC기준을 따름
서버에 저장하는 시간과 클라이언트에 따라 보여주는 것을 다르게 하기 위해 설정
웹 서버 시작
프로젝트 디렉토리에 manage.py 파일이 있어야 하며, 아래 명령어를 통해 웹 서버 실행
사용하는 브라우저에서 localhost:8000
/127.0.0.1:8000
으로 확인
<!-- manage.py가 있는 command-line -->
$python manage.py runserver
장고 모델
장고 안의 모델은 객체의 특별한 종류
이 모델을 저장하면 그 내용이 데이터베이스 에 저장되는 것이 특별하다.
이번 튜토리얼에서는 SQLite 데이터베이스사용
requirements.txt 생성
개발환경이 바뀔때마다 환경에 맞는 패키지를 설치하는 것은 굉장히 번거롭다.
이를 위해, requirements.txt 파일을 생성하여, 한번에 패키지를 받을 수 있도록 하자.
pip freeze란? Output installed packages in requirements format.
packages are listed in a case-insensitive sorted order.
<!-- requirements.txt 생성 -->
$pip freeze
Django==2.0.1
pytz==2017.3
$pip freeze > requirements.txt
<!-- 이후 패키지를 설치하고 싶다면.. -->
$pip install -r requirements.txt
어플리케이션 만들기
프로젝트 내부에 별도의 애플리케이션 생성
<!-- commend-line -->
$python manage.py startapp blog
<!-- tree로 확인한 디텍토리와 파일들 -->
.
├── Django
│ ├── blog
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── __init__.py
│ │ ├── migrations
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── config
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-36.pyc
│ │ │ ├── settings.cpython-36.pyc
│ │ │ ├── urls.cpython-36.pyc
│ │ │ └── wsgi.cpython-36.pyc
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── db.sqlite3
│ └── manage.py
└── requirements.txt
애플리케이션 생성 후, 장고에 사용한다는 것을 알리기 위해
config/setting.py 에 blog
추가 및 주석으로 분리
# Application definition
INSTALLED_APPS = [
// 기본앱
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
//써드파티앱
//커스텀앱
'blog',
]
블로그 글 모델 만들기
blog/models.py 내용 추가
# blog/models.py
from datetime import timezone
from django.db import models
# Create your models here.
# models.Model 데이터베이스 형태로 바꿔줌
class Post(models.Model):
# 테이블 컬럼
author = models.ForeignKey(
'auth.User',
on_delete=models.CASCADE,
)
title = models.CharField(max_length=200)
content = models.TextField(blank=True)
created_date = models.DateTimeField(
default=timezone.now
)
published_date = models.DateTimeField(
blank=True, null=True
)
def publish(self):
self.published_date = timezone.now()
# 데이터베이스에 기록을 하는 것 save()
self.save()
def __str__(self):
return self.title
데이터베이스에 모델을 위한 테이블 만들기
<!-- commend-line -->
$./manage.py makemigrations
Migrations for 'blog':
blog/migrations/0001_initial.py
- Create model Post
$./manage.py migrate
- db.sqlite3 파일에 테이블이 생성됨
migrate 적용 후에, Sqlector에서 테이블 생성된 것을 확인 할 수 있음.
migration의 생성과 적용
1. 맨 처음 Model구성시
1-1. 클래스 구성
class Post(models.Model):
title = models.CharField(max_length=200)
1-2. migration생성
manage.py makemigrations
0001_initial.py <- 테이블을 생성하기 위한 로직
1-3. migration을 적용
manage.py migrate
db.sqlite3 <- 이 파일에 테이블이 생성됨
2. 이미 있던 Model을 수정시
2-1. 클래스의 속성 변경
class Post(models.Model):
….
created_date = models.DateTimeField(auto_now_add=True)
2-2. migration생성
manage.py makemigrations
0002_add_field_created_date.py <- 테이블에 새 column을 추가하는 로직
2-3. migration을 적용
manage.py migrate
db.sqlite <- blog_post테이블에 새 column ‘created_date’가 생성
admin 페이지에서 blog확인하기
admin.py 페이지 수정
<!-- admin.py -->
from django.contrib import admin
from blog.models import Post
admin.site.register(Post)
만들어진 blog 앱을 확인하기 위해서, localhost:8000/admin
으로 들어간다.
로그인을 해야만 확인이 가능하므로, admin 계정을 생성
$./manage.py createsuperuser
Username (leave blank to use 'zoe'): zoe
Email address: // 굳이 안해도 됨.
Password:
Password (again):
Superuser created successfully.
localhost:8000/admin
에서 글을 추가 할 수 있다!
테스트로 5개 정도 업로드