본문 바로가기
python/Django

1. 게시판 만들기 - Django 3.x 설치 및 핵심개념 파악

by 맑은안개 2021. 2. 1.

Django(장고)란 ? 

  Django는 python 베이스에 free, open-source 웹프레임워크이다. Full-stack Framework 로 인증(auth), 관리자(admin), 세션(session), 메세지(messages) 등 웹에 필요한 필수기능과 다양한 미들웨어를 제공한다. 

 

빠른 설치 및 실행과 더불어 공식적으로 Oracle, Mysql, MariaDB, PostgreSQL Database 연동을 지원한다.

특히 DB 연동 시스템에 있어 Migration 기능은 데이타베이스 스키마(schema)내 models(테이블)을 통합관리한다. DB 제품에 상관없이 데이타베이스 모델을 쉽게 배포 관리 할 수 있다. ( 해당 내용은 2장에서 살펴본다. )

 

 

설치 준비

  • Python 3.6 이상 버전 설치 - Django 3.X 버전은 3.6이상 부터 호환

  • Django library 설치 ( 포스팅 기준 3.1.5 ) 

pip install Django

 

프로젝트 디렉토리 생성 

C:\>mkdir myexam

C:\>cd myexam

C:\myexam>

Django는 기본 프로젝트 생성 기능을 지원한다. 커맨드 창에서 아래 커맨드를 입력한다.

C:\myexam>django-admin startproject mysite

생성된 디렉토리 조회

C:\myexam>tree /f

C:.
└─mysite
    │  manage.py >> 커맨드 명령으로 프로젝트 도구를 사용할 수 있다.
    │
    └─mysite
            asgi.py
            settings.py >> 프로젝트 셋팅 정보
            urls.py     >> url 정보
            wsgi.py
            __init__.py

manage.py를 사용하여 server를 기동하거나 데이터베이스 모델을 마이그레이션 할 수 있다. 자세한 사용법은 다음 링크를 확인한다. docs.djangoproject.com/en/3.1/ref/django-admin/

settings.py 에서 프로젝트 전반에 사용되는 App( 인증, 관리자 등 ) 설정정보 부터 미들웨어( security 관련 - CSRF, clickjacking ), template( view 설정 정보 ), DATABASE 정보 등을 관리한다. 

 

서버 기동

 - 위에서 생성한 mysite[프로젝트명]으로 이동, 커맨드 창에서 다음 커맨드를 입력하여 서버를 기동한다.

C:\myexam\mysite>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 01, 2021 - 10:25:52
Django version 3.1.5, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Default port는 8000으로 셋트된다. 포트변경을 원하는 경우 커맨드 runserver [port] 를 입력한다.

python manage.py runserver 8080

사이트 접속, 확인

App 생성

  App은 게시판, 고객관리 처럼 프로젝트 내에 서비스될 Application을 의미한다. ( 프로젝트 내 다수 생성 가능 )

C:\myexam\mysite>python manage.py startapp board

board App은 아래와 같은 디렉토리/파일 구조를 갖는다.

C:.
│  db.sqlite3
│  manage.py
│
├─board
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  └─migrations
│          __init__.py
│
└─mysite
    │  asgi.py
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py

App 등록 - board/settings.py

INSTALLED_APPS = [
    'board.apps.BoardConfig', # 추가한 App을 등록한다.
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

INDEX 페이지 생성

  board App에 index페이지를 생성한다. 먼저 board/views.py 에 index 요청 처리 함수를 생성한다.

 

board/views.py

from django.shortcuts import render

def index(request):
    context = {
        'title': 'Board list',
        'board_list': [
            {'no':1, 'title': '목록1' },
            {'no':2, 'title': '목록2' },
            {'no':3, 'title': '목록3' },
            {'no':4, 'title': '목록4' },
            {'no':5, 'title': '목록5' }
        ]
    }
    return render(request, 'board/index.html', context)

게시판 테스트를 위해 하드코딩된 리스트를 요청의 응답으로 리턴한다.

render 객체는 템플릿 자원을 렌더링하는 http 응답 객체이다. 

생성한 index 함수의 url 매핑을 위해 mysite/urls.py의 urlpatterns 변수path를 등록한다.

 

mysite/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('board/', include('board.urls')),
    path('admin/', admin.site.urls),
]

App이 증가하면서 url이 많아지는 경우 프로젝트 레벨에서 모든 url을 관리하기 힘들다. include 를 사용하여 각 App내에 위치한 url정의 파일을 등록할 수 있다. App내에 urls.py를 생성하여 다음과 같이 url을 정의한다.

 

board/urls.py

from django.urls import path

from . import views

app_name = 'board'
urlpatterns = [
    path('', views.index, name='index')
]

 

admin은 관리자 페이지 접속을 위한 path 이다. 아래 키워드로 슈퍼유저를 생성하여 http://127.0.0.1:8000/admin/ 로 접속가능하다.

python manage.py createsuperuser

 

html 리소스는 Django template기능을 사용하여 출력한다. 

DjangoTemplates templates 디렉토리 내에 html 리소스를 검색한다. 아래와 같이 디렉토리 생성 후 해당 위치에 index.html 파일을 위치한다.

 

board/templates/board/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>{{ title }}</h2>

{% if board_list %}
    <ul>
        {% for data in board_list %}
        <li>{{ data.no }} : {{ data.title }}</li>
        {% endfor %}
    </ul>
{% else %}
    <h2>no board list</h2>
{% endif %}
</body>
</html>

서버에서 리턴한 응답데이터는 DTL(Django template language)를 사용하여 접근할 수 있다. DTL의 자세한 사용법은 아래 링크를 참조한다.

docs.djangoproject.com/en/3.1/topics/templates/

 

Templates | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

서버 기동 후 http://127.0.0.1:8000/board/ 로 접속한다.

 

2편에서 mariaDB 데이터베이스와 연동하고 Django migration시스템을 사용하여 model을 생성한다. 

 

 

 

 

 

 

 

 

 

 

 

반응형