2019-03-06 Django 기초 동작원리
Django TIL(2)
장고의 동작원리
- 웹서버에 요청이 오면 장고로 전달
- 장고 urlresovler는 웹페이지의 주소를 가져와 무엇을 할지 확인, urlresolver는 요청을 분기해준다. urlresolver는 웹사이트의 주소인URL(Uniform Resource Locator)를 통해 이해한다.
- urlresolver는 패턴목록을 가지고와 URL과 맞는지 하나씩 대조해서 식별한다.
- 일치하는 패턴이 있으면 장고는 해당 요청을 관련된 함수(view)에 넘겨준다.
view함수 : 특정URL과 연결된 함수를 view라고한다. 스프링이나 다른 프레임워크에서는 Controller라고 한다.
장고프로젝트 시작하기
- 모든 작업은 가상환경에서 실행하고 설치해야한다.
- 장고에서는 디렉토리와 파일명의 컨벤션이 매우 중요하다. 특정 구조를 유지해야한다.
- django-admin –version을 통해 장고의버전을 확인한다.
$django-admin startproject mysite .
// .은 현재 디렉토리에 장고를 설치하라고 스크립트에 알려주는 역할을 한다.
- 현재 디렉토리에 설치를 하면 mysite디렉토리와 manage.py가 설치가 된다.
djangogirls
├───manage.py
└───mysite
settings.py
urls.py
wsgi.py
__init__.py
- 프로젝트 형태는 위와같다.
- manage.py는 스크립트로서 사이트 관리를 도와준다. 이 스크립트로 다른 설치 작업 없이, 컴퓨터에서 웹서버를 실행할 수 있다.
- setting.py는 웹사이트 설정이 있는 파일이다.
- urls.py는 urlresolver가 사용하는 패턴 목록을 포함한다.
설정변경
TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Seoul'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
DEBUG = True
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
- 타임존을 바꾼다.
- static디렉토리설정
- 디버그 실행과 모든주소(*)에 대해서 접속을 허용한다.
- python에서는 sqlite3라는 경량지원을 기본적으로 지원을 한다.
- django-admin명령은 프로젝트 생성할때, 한번만 쓰고 안쓴다.
python manage.py --help
python manage.py migrate
python manage.py runserver
- –help옵션을 통해서 실행할 수 있는 옵션을 볼 수 있다.
- migrate를 통해 데이터베이스 세팅
- runserver를 통해 서버를 실행시킨다.
장고모델
$python manage.py startapp blog
- 현재 디렉토리에 블로그 디렉토리를 만든다?
djangogirls
├── mysite
| __init__.py
| settings.py
| urls.py
| wsgi.py
├── manage.py
└── blog
├── migrations
| __init__.py
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── views.py
- setting.py의 installed_application에 blog를 추가해야한다.
# /blog/models.py
from django.db import models
from django.utils import timezone
# Create your models here.
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
create_date = models.DateTimeField(default=timezone.now())
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
- 위의 형태로 모델을 설계.
- __str__ : 객체의 문자열 표현을 돌려주는 메서드이다. __init__처럼 특수메서드이다.
- __init__ : 객체가 인스턴스화될때 호출되는 특수 메서드 초기화메서드
- models.CharField - 글자 수가 제한된 텍스트를 정의할 때 사용합니다. 글 제목같이 짧은 문자열 정보를 저장할 때 사용합니다.
- models.TextField - 글자 수에 제한이 없는 긴 텍스트를 위한 속성입니다. 블로그 콘텐츠를 담기 좋겠죠?
- models.DateTimeField - 날짜와 시간을 의미합니다.
- models.ForeignKey - 다른 모델에 대한 링크를 의미합니다.
데이터베이스 테이블 만들기
$python manage.py makemigrations appName
$python manage.py makemigrations blog
System check identified some issues:
WARNINGS:
blog.Post.create_date: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
Migrations for 'blog':
blog/migrations/0001_initial.py
- Create model Post
# Database migrate
$python manage.py migrate blog
- 위의 명령어를 실행하면 /blog/migrations디렉토리에 0001_initial.py파일이 생성이 되는데, 데이터베이스를 어떻게 만들겠다라는 설계도이다. 아직 데이터베이스는 없는거다!!!
- $python manage.py migrate blog를 통해 반드시 migrate를 해야한다.
장고관리자(Django-Admin)
- 서버를 실행후 localhost/admin에 들어가면 admin페이지에 들어간다. 기본적으로 만들어져있다.
# settings.py
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ko-kr'
- ko-kr을 해서 한글로 바꾼다.
python manage.py createsuperuser
- superuser 아이디를 만든다.
- jimmy, askdjango
# /blog/admin.py
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
- 우리가 정의한 테이블의 형태대로 추가를 할 수 있게된다.
Written on March 6, 2019