Django 앱 작성하기

Choi Rim·2021년 7월 14일
0

Django

목록 보기
2/21
post-thumbnail

Django 버전 확인

$ python -m django --version
  • django 설치 후 django의 버전을 확인하는 명령어

프로젝트 만들기

$ django-admin startproject mysite
  • mysite라는 프로젝트 디렉토리를 생성한다는 뜻
  • 프로젝트를 생성할 때, Python이나 Django에서 사용 중인 이름은 피해야한다.
    • ex) django, test
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  • 프로젝트 디렉토리를 생성했을 때 디렉토리 안에는 이런 구조로 디렉토리와 파일이 생성되게 된다.
  • mysite/
    • 프로젝트 루트 디렉토리
  • manage.py
    • 프로젝트와 다양한 방법으로 상호작용하는 유틸리티
      • 유틸리티 : 컴퓨터 하드웨어, 운영 체제, 응용 소프트웨어를 관리하는 데 도움을 주도록 설계된 프로그램
  • mysite/
    • 이 디렉토리의 내부에는 프로젝트를 위한 실제 Python 패키지(package)들이 저장된다.
    • 이 디렉토리 내의 이름을 이용하여, 프로젝트의 어디서나 Python 패키지들을 import 할 수 있다.
      • ex) mysite.urls
  • 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
  • 위처럼 url.py라는 파일을 생성한다.
polls/url.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
  • polls/url.py
    • 위 파일안에 위와 같은 코드를 넣어준다.
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 파일 내에 존재한다.
      • Polls.apps.PollsConfig
$ 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 홈페이지
    • 세부 페이지
    • 댓글 기능
    • ...

<참고>

profile
https://rimi0108.github.io/

0개의 댓글