Django
Python 기반 웹 프레임 워크. 한 Project는 여러 App으로 구성되어 있다. App 각각은 특정 명령을 수행하는 View나 Template의 모음이라고 생각하면 된다.
Djnago vs Flask
둘 다 Python 기반 웹 프레임 워크지만, 지향성이 다르다.
flask는 늘 앞에 micro가 붙는다. 이는 최소한의 기능을 갖고 있다는 것으로, 여기에 추가적 모듈을 붙여가며 빌드업을 하는 구조이고,
Django는 이미 거의 모든 것이 내장되어 있는 구조로 되어 있다. 큰 것 안에 우리가 원하는 것을 부분부분 채워 나가면서 프로젝트를 이뤄나가는 구조이다.
Django의 구성 요소
- manage.py
- 장고를 실행하게 하는 파일
- (proj_name) file
- __init__.py
- proj_name file 디렉토리가 파이썬 모듈로써 인식되게 하는 역할
- asgi.py / wsgi.py
- 서버에서 실제 장고 프로젝트를 가동할 때 다루게 되는 곳
- settings.py
- 전반적 python django 프로젝트에 설정 사항을 반영하는 파일
- 내부 구성 요소
- SECRET_KEY
- 장고 프로젝트에 대한 secret key
- DEBUG
- True면 파이썬 프로젝트를 디버깅 모드로 실행
- ALLOWED HOST
- 리스트 내 주소를 넣어 어떤 주소에 대해 장고 프로젝트에 접근할 수 있는지 결정하게 됨
- INSTALLED_APPS / MIDDLEWARE
- 여러 앱 / 미들웨어 중 어떤 것을 설치하게 되는지 확인할 수 있다
- ROOT_URLCONF
- 프로젝트에서 URL 관리를 어떤 모듈에서 진행할 것인지 담당
- TEMPLATES
- 실제 보는 화면에 관한 요소들이 담겨 있는 부분
- WSGI-APPLICATION
- 파이썬 상에서 웹 서버와 소통하는 데 필요한 어플리케이션 담당
- DATABASE
- 프로젝트 상에서 다루게 되는 여러 자료들을 저장하는 곳을 담당
- AUTH_PASSWORD_VALIDATORS
- 패스워드 관리
- STATIC_URL
- 정적 파일들(CSS, JavaScript, Images)을 어느 폴더에 담아둘지 결정
- SECRET_KEY
- urls.py
- URL 관리
- __init__.py
App의 구성요소
- admin.py
- admin 페이지에 관한 부분
- apps.py
- 앱에 관한 설정에 관한 부분
- models.py
- 앱에 쓰일 데이터베이스 스키마 등을 클래스 형태로 작성해줄 수 있다.
- tests.py
- 프로젝트의 테스트 케이스에 대해 설명
- views.py
- 앱에서 view를 어떻게 관리해줄 것인가에 대한 코드 작성 가능
Django의 MVT Pattern
그림 출처 : www.onlinetutorialspoint.com/django/django-mvt-basic-application-example.html
어떤 User가 있을 때 그 User가 Request를 보낸다. Django(server) 입장에선 이 Request를 URL(urls.py)이 인식하게 된다. 즉, 어떤 경로에 대한 요청이 들어갔는지 체크한다.
들어온 경로가 urls.py에 있다면 View(view.py)에 보내게 된다. view에는 들어온 요청을 처리하는 logic이 담겨있다.
이 요청을 처리하다 보면 데이터베이스를 처리하는 경우도 생길텐데 그 데이터베이스를 처리하는 부분은 Model이라는 부분이다. 장고는 DB를 ORM 구조(Object Related Model)로 관리한다.
응답하는 과정에서 특정 웹페이지를 보여줘야 하는 경우도 생길텐데 이는 Template에서 관리한다. 이는 html 파일등 + template 언어로 전달해줄 수 있다. template 언어를 이용하면 view에서 처리한 변수들을 html에 임베딩해서 함께 출력해줄 수 있다.
Django 프로젝트 시작하기
장고 프로젝트 생성
django-admin startproject <proj_name>
서버 가동
python manage.py runserver
django App 만들기
django-admin startapp <app_name>
※ 이 때 프로젝트 폴더로 이동한 후에 만들어 주어야 한다! (cd proj_name) (manage.py있는 폴더에서 만들어 주면 됨)
Django 관리자 계정 생성
python manage.py migrate => default로 만들어진 데이터베이스들에 대한 여러 정보가 반영되게 된다.
python manage.py createsuperuser
http://127.0.0.1:8000/admin/에서 관리자 계정으로 로그인을 하면 추가한 데이터베이스에 대해서도 관리가 가능해진다.
View로 Request Handling 하기
정말 간단한 View를 만들어보자
view.py
from django.shortcuts import render, HttpResponse # HttpResponse 모듈 추가
# Create your views here.
def index(request):
return HttpResponse('Hello World!')
urls.py
from homepage.views import index # 실행할 함수 명시
urlpatterns = [
path('admin/', admin.site.urls), # 127.0.0.1/admin/
path('', index) # 127.0.0.1/ URL 요청이 들어오면 index 함수를 실행하라.
]
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'homepage' # 생성한 앱 이름을 꼭 추가해주어야 한다. 그래야 앱으로 인식하여 실행을 해준다.
]
실행 결과
Template으로 보여줄 화면 구성하기
render -> html 문서를 따로 관리해주는 함수
render 인자 -> render ( request, '.html', {} )
생성한 어플 폴더 내에 template 폴더를 생성 후 그 안에
index.html 파일을 생성한 후 이를 django에 반영시켜보자
visual studio code에서 ! + tab을 눌러주면 기본 html 규격 자동완성이 된다. 편리함!
index.html
<!DOCTYPE html>
<html>
<head>
<title>Python django example</title>
</head>
<body>
<!--열린 태그-->
<h1>
Title
</h1>
<!--닫힌 태그-->
<p>나는 능이버섯이당</p>
</body>
</html>
views.py
from django.shortcuts import render
def index(request):
return render(request, 'index.html', {})
settings.py
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR,'hompage','template')],
'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',
],
},
},
]
실행 결과
고정된 자료가 아닌 동적으로 변화하는 자료 보여주기
views.py
def index(request):
number = 10
return render(request, 'index.html', {"my_num":number})
index.html
<!DOCTYPE html>
<html>
<head>
<title>Python django example</title>
</head>
<body>
<!--열린 태그-->
<h1>
Title
</h1>
<!--닫힌 태그-->
<p>나는 능이버섯이당</p>
<!-- Template language -->
<p>{{ my_num }}</p>
</body>
</html>
실행 결과
{{}}라는 템플릿 문법을 이용해 직접적으로 데이터를 넣어줄 수 있다.
템플릿 필터 적용
views.py
def index(request):
name = "Michael"
return render(request, 'index.html', {"my_name":name})
index.html
<!DOCTYPE html>
<html>
<head>
<title>Python django example</title>
</head>
<body>
<!--열린 태그-->
<h1>
Title
</h1>
<!--닫힌 태그-->
<p>나는 능이버섯이당</p>
<!--Template language-->
<!--Template filter | -->
<p>{{ my_name|length }}</p>
<p>{{ my_name|upper }}</p>
</body>
</html>
실행 결과
Template tag
views.py
def index(request):
# return HttpResponse('<h1>Hello World!<h1>')
nums= [1,2,3,4,5]
return render(request, 'index.html', {"my_list":nums})
index.html
<!DOCTYPE html>
<html>
<head>
<title>Python django example</title>
</head>
<body>
<!--열린 태그-->
<h1>
Title
</h1>
<!--닫힌 태그-->
<p>나는 능이버섯이당</p>
{% for element in my_list %}
{%if not element|divisibleby:"2"%}
<p>{{element}}</p>
{%endif%}
{% endfor %}
</body>
</html>
실행 결과
'AI > KDT 인공지능' 카테고리의 다른 글
[06/02] End to End Machine Learning Project (0) | 2021.06.02 |
---|---|
[05/18] Django로 동적 웹페이지 만들기 (0) | 2021.05.18 |
[05/12] EDA mini project (0) | 2021.05.12 |
[05/12] 데이터 씹고 뜯고 맛보고 즐기기 - EDA (0) | 2021.05.11 |
[05/11] AWS를 활용한 인공지능 모델 배포 (0) | 2021.05.11 |