25 Fri
TIL
[프로그래머스 AI 스쿨 1기] 4주차 DAY 3
django I - What is
Flask와는 또다른 웹 프레임워크 장고. Python 기반 웹 프레임워크이며 Pinterest나 Instagram은 장고로 만들어짐.
flask vs django
방향성이 다르다.
flask : micro라는 말이 많이 붙는다. 최소한의 베이스에서 조금씩 채워나간다. 작은 프로젝트에 적합.
django : 모든 것이 내장되어 있다. 큰 프로젝트에 적합.
가상환경 설치하기
virtualenv venv
.\venv\Scripts\activate.bat
pip install django
django-admin startproject webproj
cd webproj
python manage.py runserver
http://127.0.0.1:8000/
로 이동 후 아래 화면이 뜨면 성공적으로 완료

django 구성요소
manage.py : 장고를 실행하는 파일이며 실제로는 python - manage.py - runserver의 순서를 통해 실행된다.

__init__.py : python 모듈로써 인식되게 하는 파일
asgi.py, wsgi.py : 장고에서 서버를 운용할 때 다루는 파일
settings.py : 전반적인 장고 프로젝트에 설정 파일을 반영
secret key
debug = True : python 프로젝트를 디버깅 모드로 실행 가능
allowed_hosts : 어떠한 주소에 대해서 장고프로젝트가 접근 가능
installed_apps :장고 프로젝트는 여러 앱으로 이루어져있다. 설치된 앱 목록
middle_ware
root_urlconf : url관리를 어떤 모듈에서 진행할 것인지
templates : 실제 보는 화면에 관한 요소들이 담겨있음
wegi_application : python상에서 웹서버와 소통할 때 필요한 어플리케이션을 담당
databases : 프로젝트 상에서 저장되는 데이터를 담당할 곳. default는 sqlite3
auth_password_validation : 관리자가 패스워드를 관리하는 곳
language_code
time_zone
use_i18n
use_l10n
use_tz
static_url : css, js, images 등의 정적 파일들을 어느 폴더에 담아둘지 결정
=> setting만 봐도 플라스크보다 많은 기능을 가지고 있음을 알 수 있다. 기능을 적절하게 활용하면 정말 빠르게 웹사이트를 구축할 수 있다.
urls.py : url을 관리
urlpatterns : path('a', b) => 'a' 라는 요청이 들어오면 이에 대한 응답은 b에서 담당한다.
django Project and App
프로젝트는 여러가지 앱으로 구성된다. 앱은 특정 뷰나 템플릿의 모음.
ex) 스포츠 앱, 블로그 앱 등
django App 만들기
이전과는 다르게 상위 폴더에서 호출하는 것이 아닌 해당 폴더에서 호출해야 한다.
django-admin startapp homepage

__init__.py
: python 모듈로써 인식되게 하는 파일
admin.py
: admin 페이지에 관한 부
apps__init__.py
: 앱에 대한 설정을 관
models.py
: 홈페이지 모듈에서 쓰일 데이터베이스의 스키마를 클래스 형태로 정
tests.py
: 테스트 케이스 설명
views.py
: 뷰 관
django의 MVT Pattern
디자인 패턴 : 코드의 모듈화를 이용해서 각 코드가 독립적으로 동작해서 유기적으로 원하는 목표를 달성할 수 있게 하는 구조
장고는 MVT 패턴을 채택했다. Model View Template. MVC(Controller)를 바탕으로 장고만의 디자인 패턴 채택. 유저가 리퀘스트를 보내면 장고(서버)는 URL(urls,py)을 체크하여 어떤 경로로 요청이 왔는지 파악하고 View(views.py)에서 요청을 처리한다. 이 때 DB를 관리 및 소통을 Model에서 담당한다. 장고는 DB를 ORM 방식으로 관리한다. Object Relational Mapping. 쿼리를 통해 DB에 CRUD 접근 가능. 웹 페이지나 웹 문서를 보여주는 요청은 Template에서 관리하며 .html 파일 등으로 전달해줄 수 있다. 이 때 template 언어를 사용한다. 기본적으로 html은 로직이나 변수를 사용하는 행위는 할 수 없지만 template언어를 사용하면 html에 로직을 추가하는 행위를 할 수 있다.
django II - View
View로 Request Handling 하기
View는 model과 소통하기도 하고 template과 소통하기도 한다. View는 장고에서 중추적인 역할을 담당하는데, url이 전송되면 url의 요청을 실제로 처리하는 곳.
views.py
from django.shortcuts import render, HttpResponse
# Create your views here.
def index(request): # 장고에서 request가 인자로 주어지고 request에 대한 처리를 해줄 수 있다.
return HttpResponse("Hello World!")
urls.py
from django.contrib import admin
from django.urls import path
from homepage.views import index
urlpatterns = [
path('admin/', admin.site.urls), # 127.0.0.1/admin/
path('', index) # 127.0.0.1/
]
setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'homepage', #추가하지 않으면 homepage app을 찾을 수 없다.
]
1. 사용자가 http://127.0.0.1:8000 에 요청을 보낸다.
2. urls.py에서 urlpatterns을 참조하여 해당 url에 대한 처리 로직이 있는지 확인한다.
3. 이 후 views.py에서 index 함를 실행한다.
path('admin/', admin.site.urls), # 127.0.0.1/admin/
해당 주소로 접근하면 다음과 같은 페이지가 열린다.

python manage.py createsuperuser
초기에는 오류가 난다. 데이터베이스에 대한 migration이 진행되어야 하기 때문.
python manage.py migrate
default로 만들어진 데이터베이스 정보가 반영된다. 장고 프로젝트에 디비 정보가 잘 연동된 것이며 이 때 관리자 계정을 만들 수 있다.
이후 만든 관리자 계정으로 로그인 하면 다음과 같은 페이지가 열린다.

이를 flask에서 진행하면 직접 관리자 페이지를 만들어야 되지만, django는 default template를 제공한다. 이미 authentication 기능을 제공하였음.
django III - Template
view를 통해 html, css, javascript를 보여줄 수 있는데 이 때 template를 사용한다.
def index(request):
return HttpResponse("<h3>Hello World!</h3>")
위 처럼 html 태그를 같이 입력해서 출력할 수 있다. 이 때 상당히 많은 량의 응답을 하기에는 어려운 부분이 있으므로 render를 사용한다.
views.py
def index(request):
#return HttpResponse("<h3>Hello World!</h3>")
render(request, 'index.html', {})
해당 request를 받아 index.html로 렌더링 하며 {}의 추가 기능을 한다는 뜻
rendering은 어떤 내용을 보여준다는 의미보다는 어떠한 데이터를 바탕으로 해당 html을 완성한다는 의미이다.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Python django example</title>
</head>
<body>
<h1>Title</h1>
<p>blahblahblah</p>
</body>
</html>
setting.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'homepage', '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
<body>
<h1>Title</h1>
<p>blahblahblah</p>
<p>{{ my_num }}</p>
</body>
{{ }} 는 템플릿 언어 사용을 할 수 있게한다.
|, 파이프라인은 필터링을 의미한다.
{{ my_name | length }}
: 길이를 출력
{{ my_name | upper }}
: 모두 대문자로 출력
필터링 종류는 굉장히 많으며 다큐먼트를 참조.
for문 태그와 if문 태그
views.py
def index(request):
nums = [1, 2, 3, 4, 5]
return render(request, 'index.html', {"my_list" : nums})
index.html
<body>
{% for element in my_list %}
{% if not element|divisibleby:"2" %}
<p>{{ element }}</p>
{% endif %}
{% endfor %}
</body>

Last updated
Was this helpful?