Python 기반 웹 프레임워크
Flask vs Django
python -m venv venv
.\venv\Scripts\activate
pip install django
django-admin startproject <proejct_name>
django-admin startproject webproj
Django 기본 구성요소
__init__.py
: 파이썬 모듈로써 인식하게 해주는 역할
asgi.py
, wsgi.py
: 서버에서 django 프로젝트를 가동할 때 다루게 될 부분
settings.py
: 전반적인 django 프로젝트의 설정사항을 반영
BASE_DIR, SECRET_KEY, DEBUG, ALLOWED_HOSTS, INSTALLED_APPS, MIDDLEWARE
ROOT_URLCONF : 프로젝트의 url을 관리할 모듈 지정
TEMPLATES
WSGI_APPLICATION : 파이썬에서 웹서버와 소통하는데 필요한 어플리케이션 담당
DATABASES, AUTH_PASSWORD_VALIDATORS
LANGUAGE_CODE, TIME_ZONE, USE_I18N, USE_L10N, USE_TZ
STATIC_URL
👉 이미 많은 기능들이 내장되어 있음
urls.py
: url 관리
Django 프로젝트에서의 App
한 project는 여러 App으로 구성되어 있다.
django-admin startapp homepage
💡 settings.py
파일의 INSTALLED_APPS 리스트에 생성한 app 등록
INSTALLED_APPS = [
...
'homepage.apps.HomepageConfig' # 추가
]
Django App 기본 구성요소
admin.py
: 기존적으로 제공되는 admin page 설정 관리apps.py
: 앱에 대한 설정 관리model.py
: 앱 내에서 쓰일 스키마를 클래스 형태로 작성views.py
: 앱 내에서 다룰 뷰 관리Django의 MTV 패턴
사진출처: https://unifox.tistory.com/6 [Python Django]
MVC 패턴(Model, View, Controller)과 비슷한 로직
views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello World!")
프로젝트 디렉토리에 urls.py
파일이 있지만
각 앱에 urls.py
파일을 따로 두어 관리하는 것이 좀 더 편리하다.
webproj/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('homepage.urls')), # 127.0.0.1
path('admin/', admin.site.urls), # 127.0.0.1/admin
]
hompage/urls.py
from django.urls import path
from .views import index
app_name = 'homepage'
urlpatterns = [
path('', index), # 127.0.0.1
]
app_name
은 추후에 template에서 사용하기 위하여 미리 작성해두었다.python manage.py createsuperuser
: 슈퍼유저 생성
python manage.py createsuperuser
마이그레이션을 하기전에 슈퍼유저 계정을 생성하려고 하면 다음과 같은 오류가 발생한다.
auth_user
테이블이 존재하지 않아서 발생한 오류이다.
💡
admin
, auth
, contenttypes
, sessions
app이python manage.py migrate
: 마이그레이션 실행
python manage.py migrate
마이그레이션을 실행하고 슈퍼유저를 생성하여 admin 페이지에서 로그인하면 다음과 같은 페이지를 확인할 수 있다.
homepage/views.py
def index(request):
return HttpResponse("<h1>Hello World!</h1>")
지금은 단순한 문자열을 반환하여 확인하기 위해 위와 같이 간단하게 작성하였다.
하지만 단순한 문자열이 아닌 긴 내용의 html 코드를 반환해주려면 어떻게 해야할까?
→ render()
함수를 이용!
📌 render() 의 파라미터
homepage/templates/index.html
- template 파일 작성
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Python django example</title>
</head>
<body>
<h1>Title</h1>
<p>blah blah blah</p>
</body>
</html>
homepage/views.py
def index(request):
return render(request, 'index.html', {})
**render()
의 context 파라미터를 이용하여 view에서 template으로 값 넘겨주기**
템플릿 변수 {{ number }}
homepage/views.py
def index(request):
number = 10
return render(request, 'index.html', {"my_num": number})
homepage/templates/index.html
→ template 파일 작성
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Python django example</title>
</head>
<body>
<h1>Title</h1>
<p>blah blah blah</p>
<p>{{ my_num }}</p> <!-- 추가 -->
</body>
</html>
템플릿 필터 {{ name | upper }}
homepage/views.py
def index(request):
name = "Michael"
return render(request, 'index.html', {"my_name": name})
homepage/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Python django example</title>
</head>
<body>
<h1>Title</h1>
<p>blah blah blah</p>
<p>{{ my_name | length }}</p> <!-- 추가 -->
<p>{{ my_name | upper }}</p> <!-- 추가 -->
</body>
</html>
템플릿 태그 {% tag ... %}
~ {% endtag %}
homepage/views.py
def index(request):
nums = [1, 2, 3, 4, 5]
return render(request, 'index.html', {"my_list": nums})
homepage/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Python django example</title>
</head>
<body>
<h1>Title</h1>
<p>blah blah blah</p>
{% for element in my_list %}
{% if not element|divisibleby:"2" %}
<p>{{ element }}</p>
{% endif %}
{% endfor %}
</body>
</html>