python 기반 웹 프레임워크
pinterest instagram에서 사용이 됨.
우리가 배웠던 flask와 비교해서는 둘다 같은 프레임워크지만 이 둘이 지향하는 방향이 다르다. flask는 '마이크로'로서 최소한의 기능을 가지고 여기에 살을 붙여가는 방식(추가적인 imports)이다. django는 많은 것들을 이미 갖추고 있기에 우리가 그 폼을 채워가면 된다.
cmd 환경에서 flask때와 마찬가지로 프로젝트 폴더에 가상 환경을 만들어준다.
cd django-proj
virtualenv venv
#activate 실행을 위해 디렉토리 이동
cd venv
cd Scripts
activate
#설치 후 확인
pip install django
pip freeze
#디렉토리를 다시 옮겨준후 webproj를 만든다.
django-admin startproject <proj-name>
#
cd webproj
python manage.py runserver
-> http://127.0.0.1:8000/
__init__.py : webproj 폴더가 python 모듈로서 인식되게 하기 위함
asgi.py, wsgi.py : 서버에서 실제로 django프로젝트를 가동할때 다룸
settings.py : 전반적인 프로젝트의 설정사항을 반영, 굉장히 많은 기능들이 이미 내장되어 있다는 것을 알 수 있다.
urls.py : url을 관리하는 곳
Project 안에는 다양한 App들이 있다. 네이버로 예를 들면 blog, sports, cafe로서 django는 각각을 독립적으로 만들어 줄 수 있다는 장점이 있다.
cd webproj
django-admin startapp homepage
admin.py : admin page에 관한 부분
apps.py : app에 대한 설정
models.py : 홈페이지에서 쓰일 데이터 베이스의 스키마 등등을 클래스의 형태로 작성
tests.py : test case
views.py : homepage에서 view를 관리
우리는 필요한 부분을 채워가며 기능을 구현해나가면 된다.
MVC : model view controller
MVT : model template view
장고 프레임워크에서는 View를 Template, Controller는 View라고 표현하며, MVC를 MVT 패턴이라고 한다. 모델은 데이터 베이스에 저장되는 데이터를 의미하는 것이고, 템플릿은 사용자에게 보여지는 UI부분을, 뷰는 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달하는 역할을 수행한다.
어떤 유저가 request를 보낸다.
server django는 URL(urls.py)를 체크하고
이것을 View(views.py)로 보낸다.
model은 DB(ORM object related model)와
Teplate은 html파일로 전달 template언어를 이용해서 html을 for if등을 사용 가능
사용자에게 response
view는 django에서 url 처리를 담당한다.
#views.py의 초기 코드
from django.shortcuts import render
# Create your views here.
from django.shortcuts import HttpResponse, render
# Create your views here.
def index(request):
return HttpResponse("Hello World!")
어떤 url경로에서 위의 index를 불러올지 정하기 위해서 webproj폴더에서 urls.py를 수정한다.
#urls.py의 초기코드
from django.contrib import admin
from django.urls import path
#admin이라는 요청에 대해서 admin.site.urls을 rseponse
urlpatterns = [
path('admin/', admin.site.urls),
]
from django.contrib import admin
from django.urls import path
from homepage.views import index
urlpatterns = [
path('', index) # 127.0.0.1/일때 index를 실행하라
path('admin/', admin.site.urls),
]
homepage폴더를 사용하기 위해서는 webproj의 settings.py에서 INSTALLED_APPS에 'homepage'를 입력해주어야 한다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'homepage',
]
#dc webproj
python manage.py runserver
과정은 사용자가 127.0.0.1에 요청을 보낸다.
urls.py에서 path를 확인한다. 그후 index를 실행하게 된다.
views.py에서 index를 실행한다.
django앱에 대한 관리자 계정이다.
cmd환경에서 계정을 만들 수 있다.
#SQlite를 연동
python manage.py migrate
python manage.py createsuperuser
django는 template으로 admin 사이트를 제공한다.
view <- HTML CSS Javascript
template 언어를 사용
#views.py에 html 헤더를 사용
def index(request):
return HttpResponse("<h1>Hello World!</h1>")
#django에는 html문서를 따로 관리해줄 수 있는 render 함수를 제공한다.
render(request, '.html', {})
template을 새로 만든다.
새로운 html 파일을 만들어야한다.
html을 각 앱의 디렉토리에서 관리한다.
homepage에 template이라는 폴더를 만든다.
template에 index.html을 만든다.
html은 크게 head body로 나뉘어 진다.
<!DOCTYPE html> # html 5로 작성됨을 밝힘
</html>
<head> # html에 대한 meta적인 정보, 뒤에서 이루어지는 정보
<title>Python django example</title>
</head>
<body> # html을 구성하는 실제 요소를 적어준다.
<h1>Title</h1>
<p>blah blah blah</p>
</body>
</html>
views.py를 수정한다.
def index(request):
#return HttpResponse("<h1>Hello World!</h1>")
render(request, 'index'.html, {})
settings.py에서 html파일이 어디에 있는지를 명시해주어야 한다.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
'DIRS': [BASE_DIR + 'homepage/teplate/index.html'],
BASE_DIR을 더해주는 것은 폴더가 컴퓨터에서 어디에 위치한지를 알려주어야 한다.
BASE_DIR = Path(__file__).resolve().parent.parent
디렉토리를 합쳐주는 전문적인 함수 os를 사용할 수 있다.
import os
'DIRS': [
os.path.join(BASE_DIR, "homepage", "template")
],
어떤 데이터({ })를 바탕으로 html안의 내용을 완성한다. 통합적인 template을 구성
def index(request):
number = 10
render(request, 'index'.html, {"ny_num" : number})
<!DOCTYPE html>
</html>
<head>
<title>Python django example</title>
</head>
<body>
<h1>Title</h1>
<p>blah blah blah</p>
<p>{{ my_num }}</p> # template언어의 사용
#views에서 만든 my_num을 index.html에서 사용한다.
</body>
</html>
html파일 자체로는 정해진 것만을 보여줄 수 있지만 template언어를 이용하면 어떤 내용을 가변적으로 수정할 수 있다.
template filter
<p>{{ my_name }}</p> -> Michael
<p>{{ my_name | length }}</p> -> 7
<p>{{ my_name | upper }}</p> -> MICHAEL
#document를 활용해서 더 알아볼것
template tag
django template언어를 사용하는 것
{% tage ... %}
{% endtage ... %}
#views.py
def index(request):
nums = [1,2,3,4,5]
render(request, 'index'.html, {"ny_list":nums})
#index.html
{% for element in my_list %}
<p>{{ element }}</p>>
{% endfor %}
{% for element in my_list %}
{% if element|divisibleby:"2" %}
<p>{{ element }}</p>>
{% endif %}
{% endfor %}
-> 2, 4
{% for element in my_list %}
{% if not element|divisibleby:"2" %}
<p>{{ element }}</p>>
{% endif %}
{% endfor %}
-> 1, 3, 5
#cmd 환경
django-admin startproject web_study #프로젝트 만들기
cd web_study #경로이동
python manage.py migrate #데이터베이스
python manage.py runserver #서버 확인해보기
#앱을 만들기
python manage.py startapp main
#settings.py 앱을 등록해주기
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'main',
]