Writer: Harim Kang
'파이썬 웹 프로그래밍(실전편)'을 공부하면서 정리한 글입니다. 책에서는 리눅스 환경에서 진행하지만 저는 윈도우 환경에서 실습을 따라가 보겠습니다. Windows 10 OS환경 이지만 해당 책을 공부하고 싶은 분들에게 도움을 드리고 싶습니다. 장고에 대한 기본적인 내용은 아래의 포스팅에서 확인할 수 있습니다.
Django는 MVT 패턴 설계를 바탕으로 다른 sw와 마찬가지로 설계, 구현의 과정을 진행하면 됩니다.
(가상 환경) D:\dev\Source\django> django-admin startproject [프로젝트 이름]
'''
# tree 명령어 - 내부 구조를 쉽게 확인할 수 있습니다.
# https://docs.microsoft.com/ko-kr/windows-server/administration/windows-commands/tree
> tree D:\dev\Source\django\[프로젝트 이름] /f
D:\DEV\SOURCE\DJANGO\[프로젝트 이름]
│ manage.py
│
└─[프로젝트 이름]
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
'''
이제 settings.py에서 프로젝트 설정을 해보겠습니다. 설정과 관련된 자세한 내용들은 아래의 코드에 주석으로 설명하였습니다.
# settings.py의 일부 설정이 필요한 부분만을 가져왔습니다.
# DEBUG 변수가 True일 때는 개발모드, False일 때는 운영 모드입니다.
# DEBUG = False인 경우, ALLOWED_HOSTS에 서버의 IP or Domain을 지정해주어야합니다.
# DEBUG = True일 때는, Default로 localhost가 지정됩니다.
DEBUG = True
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# 프로젝트에서 사용하는 APP을 등록하는 부분입니다.
# startapp을 통해서 APP을 생성하면 등록을 해야합니다.
# 현재는 프로젝트 생성시, 기본으로 등록되는 APP들이 있습니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# Templates 설정은 아래의 DIRS 항목에 템플릿 위치를 추가합니다.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # <- 해당 부분에 템플릿이 위치할 디렉토리를 지정합니다.
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# Database 엔진 설정입니다. Django의 Defalut DB는 SQLite3입니다.
# MYSQL, Oracle, PostgreSQL 등의 DB로 변경할 수 있습니다.
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 언어 및 Timezone 설정입니다.
# LANGUAGE_CODE의 Default 값은 'en-us'로 되어있습니다. 한글은 'ko-kr'입니다.
# TIME_ZONE의 Default 값은 세계표준시인 'UTC', 한국 시간은 'Asia/Seoul'입니다.
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Seoul'
# 정적 파일(CSS, JavaScript, Images)에 대한 설정입니다.
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # <- 추가
# Media files에 대한 설정입니다. - 파일 업로드 기능과 관련
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
(가상 환경) D:\dev\Source\django> python manage.py migrate
'''
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
'''
(가상 환경) D:\dev\Source\django> tree D:\dev\Source\django\[프로젝트 이름] /f
'''
D:\DEV\SOURCE\DJANGO\[프로젝트 이름]
│ db.sqlite3
│ manage.py
│
└─bookmark
│ asgi.py
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
│
└─__pycache__
settings.cpython-37.pyc
urls.cpython-37.pyc
__init__.cpython-37.pyc
'''
(가상 환경) D:\dev\Source\django\[프로젝트 이름]> python manage.py createsuperuser
'''
사용자 이름 (leave blank to use 'harim'):
이메일 주소: harimkang4422@gmail.com
Password: # <- 비밀번호 입력
Password (again): # <- 비밀번호 확인
Superuser created successfully.
'''
(가상 환경) D:\dev\Source\django\[프로젝트 이름]> python manage.py startapp [app 이름]
(가상 환경) D:\dev\Source\django\[프로젝트 이름]> tree D:\dev\Source\django\[프로젝트 이름]\[앱 이름] /f
'''
D:\DEV\SOURCE\DJANGO\[프로젝트 이름]\[앱 이름]
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
__init__.py
'''
# [프로젝트 이름]\settings.py
# 등록할 이름은 해당 app 디렉토리의
# app.py의 [앱 이름]Config 클래스를 확인하시면 됩니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'[app 이름].apps.[app.py의 Config 클래스 이름]',
]
# [앱 이름]\models.py
from django.db import models
# Create your models here.
class Bookmark(models.Model):
title = models.CharField('TITLE', max_length=100, blank=True)
url = models.URLField('URL', unique=True)
def __str__(self):
return self.title
# [앱 디렉토리]\admin.py
from django.contrib import admin
from [앱 디렉토리].models import Bookmark
# Register your models here.
@admin.register(Bookmark)
class BookmarkAdmin(admin.ModelAdmin):
list_display = ('id', 'title', url')
(가상 환경) D:\dev\Source\django\[프로젝트 이름]> python manage.py makemigrations [앱 이름]
'''
Migrations for '[앱 이름]':
[앱 이름]\migrations\0001_initial.py
- Create model Bookmark
'''
(가상 환경) D:\dev\Source\django\[프로젝트 이름]> python manage.py migrate
'''
Operations to perform:
Apply all migrations: admin, auth, [app], contenttypes, sessions
Running migrations:
Applying [app].0001_initial... OK
'''
# Project 수준의 migration --> DB에 반영
> python manage.py migrate
# APP 수준의 migration 준비 --> 프로젝트에 통합될 준비
> python manage.py makemigrations [app]
# 모든 migration을 보여주고, 적용 여부를 출력
> python manage.py showmigrations
# [app]의 [n]번 마이그레이션을 적용할 때 사용될 SQL 문장을 출력
> python manage.py sqlmigrate [app] [n]
이제 반영된 모습을 확인해보겠습니다.
# Django Server 실행 (Background) // 종료는 Ctrl+Break
(가상 환경) D:\dev\Source\django\[프로젝트 이름]> python manage.py runserver 0.0.0.0:8000
'''
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
June 15, 2020 - 14:39:57
Django version 3.0.6, using settings '[Project name].settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.
'''
위의 명령어를 통해 서버를 실행할 수 있고, http://127.0.0.1:8000/admin 주소로 admin 사이트에 접속합니다.
아까 생성한 관리자 계정으로 로그인합니다.
이제 Bookmark의 옆 [추가]버튼을 누르면 아래와 같이 아까 설정한 변수들을 추가할 수 있게 화면이 나옵니다. 이를 통해 DB에 반영이 되었음을 확인 할 수 있습니다.
# [Projectname]\urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# class-based views
path('[appname]/', include('[appname].urls')),
]
# [appname]\urls.py
from django.urls import path
from .views import BookmarkLV, BookmarkDV
urlpatterns = [
path('', BookmarkLV.as_view(), name='index'),
path('<int:pk>/', BookmarkDV.as_view(), name='detail'),
]
이제는 BookmarkLV와 BookmarkDV라는 view 클래스를 만들어보겠습니다.
# [appname]\views.py
from django.shortcuts import render
# class형 Generic View ListView, DetailView 사용
from django.views.generic import ListView, DetailView
# Table 조회를 위한 model class import
from bm.models import Bookmark
# Create your views here.
class BookmarkLV(ListView):
# Bookmark 테이블의 Record list를 보여주기 위한 View class
# 객체가 담긴 List를 구성하여 Context 변수(object_list)로 Template에 전달하는 역할
# Template file name: bm/bookmark_list.html
model = Bookmark
class BookmarkDV(DetailView):
# Bookmark 테이블 특정 Record에 대한 meta-data를 보여주는 View Class
# 특정 객체 하나를 Context 변수(object)에 담아 Template에 전달하는 역할
# Template file name: bm/bookmark_detail.html
model = Bookmark
# bookmark_list.html
<!DOCTYPE html>
<html>
<head>
<title>Harim Bookmark List</title>
</head>
<body>
<div id="content">
<h1>Bookmark List</h1>
<ul>
{% for bookmark in object_list %}
<li><a href="{% url 'detail' bookmark.id %}">{{ bookmark }}</a></li>
{% endfor %}
</ul>
</div>
</body>
</html>
위의 html 파일은 BookmarkLV와 연결된 템플릿 파일입니다.
안에- 형식으로 object_list의 데이터들을 리스트로 보여줍니다.
# bookmark_detail.html
<!DOCTYPE html>
<html>
<head>
<title>Harim Bookmark Detail</title>
</head>
<body>
<div id="content">
<h1>{{ object.title }}</h1>
<ul>
<li>URL: <a href="{{ object.url }}">{{ object.url}}</a></li>
</ul>
</div>
</body>
</html>
결과 확인하기
서버 실행 > 다시 http://127.0.0.1:8000/admin로 접속 > bookmark [추가]
2개의 bookmark [저장]
Naver [click]
D:\DEV\SOURCE\DJANGO\PROJECT
│ db.sqlite3
│ manage.py
│
├─.idea
│ │ bookmark.iml
│ │ misc.xml
│ │ modules.xml
│ │ workspace.xml
│ │
│ └─inspectionProfiles
│ profiles_settings.xml
│
├─bookmark
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ urls.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ │ 0001_initial.py
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ 0001_initial.cpython-37.pyc
│ │ __init__.cpython-37.pyc
│ │
│ ├─templates
│ │ └─bookmark
│ │ bookmark_detail.html
│ │ bookmark_list.html
│ │
│ └─__pycache__
│ admin.cpython-37.pyc
│ apps.cpython-37.pyc
│ models.cpython-37.pyc
│ urls.cpython-37.pyc
│ views.cpython-37.pyc
│ __init__.cpython-37.pyc
│
└─mypage
│ asgi.py
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
│
└─__pycache__
settings.cpython-37.pyc
urls.cpython-37.pyc
wsgi.cpython-37.pyc
__init__.cpython-37.pyc
[파이썬 웹 프로그래밍] #1. 장고(Django) 란? (0) | 2020.05.19 |
---|