2019-03-06 Django 기초 동작원리

Django TIL(2)

장고의 동작원리

  1. 웹서버에 요청이 오면 장고로 전달
  2. 장고 urlresovler는 웹페이지의 주소를 가져와 무엇을 할지 확인, urlresolver는 요청을 분기해준다. urlresolver는 웹사이트의 주소인URL(Uniform Resource Locator)를 통해 이해한다.
  3. urlresolver는 패턴목록을 가지고와 URL과 맞는지 하나씩 대조해서 식별한다.
  4. 일치하는 패턴이 있으면 장고는 해당 요청을 관련된 함수(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