👉 Django란?
- 파이썬 언어로 만들어진 무료 오픈소스 웹 어플리케이션 프레임워크이다.
👉 작동방식
- 사용자가 서버에 웹페이지를 보내달라고 요청(request) 한다.
- 서버가 메일박스(port)에서 요청이 도착했는지 확인한다.
- 장고의 urlresolver가 요청을 가져와 URL과 맞는지 확인한다.
- 만약 일치하는 것이 있으면, 해당 요청을 VIEW에 넘겨준다.
- 요청이 도착했으면, 웹페이지를 보내준다.
👉 Django 프로젝트 파일의 기능
- manage.py (명령창을 통해, 각종 django의 명령을 실행하기 위한 파일)
- <프로젝트> (프로젝트명으로 생성된 디렉토리, 함부로 수정 금지!)
- __init__.py (python이 이 폴더를 패키지로 인식되도록 하기 위해 필요한 빈 파일)
- asgi.py (웹서버와, django를 연결해주는 API, wsgi의 상위호환)
- settings.py (현재 프로젝트의 기본 설정을 구성하는 파일)
- urls.py (사용자가 요청하는 URL에 따라, 일치하는 view를 찾아 연결)
- wsgi.py (WSGI를 사용하여 django와 웹 서버를 연결하는 파일, 실서비스에서의 웹서비스 진입점)
👉 Django MVC
- django에서는 컨트롤러(Controller)를 뷰(Views)라고 하며,
- 뷰(Views)는 템플릿(template) 이며,
- 템플릿(template)은 데이터를 사용자에게 보여주는 컴포넌트이다.
- 그래서 django를 흔히 MVT 프레임워크(Model,View,Template)이라고도 한다.
👉 Model 이란?
- MVC 모델에서 M(Model)의 역할을 담당
- DB의 데이터를 생성,수정 한다.
- DB에서 가져온 데이터를 View로 전달한다.
- Django App 안에 기본적으로 생성되는 models.py 모듈안에 정의한다.
- models.py 안에, 여러개의 모델 클래스를 정의하며, 하나 하나가 DB의 테이블에 해당한다.
👉 Model 기본 사용법(models.py)
# 기본 설정 파일 불러오기 위한 모듈
from django.conf import settings
# DB 불러오기 위한 모듈
from django.db import models
# 현재 시간 불러오기 위한 모듈
from django.utils import timezone
# DB에 생성하고 싶은 테이블을 클래스 형태로 적어준다
# models.Model이 붙어있어야만 장고 모델로 인식한다
# models.<필드타입>(<필드옵션>) 형식으로 DB를 작성한다
class Post(models.Model):
# django에서 기본으로 주어지는 AUTH_USER_MODEL(유저 테이블)과 연결한다.
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now())
published_date = models.DateTimeField(blank=True, null=True)
# <Post객체>.publish 입력시, 해당 객체의 published_date에 현재시간을 넣어주는 함수
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
# Primary Key를 지정하지 않아도, Django가 자동지정
# 필드 정의 위해 클래스 변수 사용
( 테이블 컬럼의 메타 데이터를 정의하기 때문에 )
# 구성하고자하는 필드 클래스 객체를 가져온다. 괄호()안에 옵션 지정
# 필드마다 반드시 지정해 주어야 하는 옵션이 존재하기도 한다. (CharField : max_length)
👉 Model 필드 클래스 모음
CharField :
제한된 문자열 필드
최대 길이(max_length) 옵션을 지정해야 한다.
EmailField : 이메일 주소 체크
GenericIPAddressField : IP 주소 체크
FilePathField : 특정 폴더 경로 체크
URLField : URL 체크
TextField : 대용량 문자열 필드
IntegerField :
32 비트 정수형 필드
BigIntegerField : 큰 정수 필드
SmallIntegerFiled : 작은 정수 필드
BooleanField :
true / false 필드
NullBooleanField : Null을 허용한 true / false 필드
DatetimeField :
날짜, 시간 필드
DateField : 날짜 필드
TimeField : 시간 필드
DecimalField : 소수점 필드
BinaryField : 바이너리 데이터 필드
FileField : 파일 업로드 필드
ImageField : 이미지 파일 필드
UUIDField : GUID(UUID)를 저장하는 필드
# 필드 간 관계 필드
ForeignKey : 외부 테이블에 연결하는 필드
ManyToManyField : 많은 테이블과 많은 테이블 연결하는 필드
OneToOneField : 테이블을 일대일로 연결하는 필드
👉 Model 필드 옵션
# 필드의 인자로 주어, 옵션을 사용할 수 있다.
null :
null=True 이면, Empty 값을 DB에 NULL로 저장한다.
DB에서 Null이 허용된다.
blank :
blank=False 이면, 필수적으로 입력해야 한다.
blank=True 이면, 선택적으로 입력해도 된다.
primary_key :
primary_key=True 이면, 해당 필드를 Primary Key로 설정한다
( 반드시 존재해야하는 Key )
unique :
unique=True 이면, 해당 필드를 Unique Key로 설정한다
( 중복되면 안되는 Key )
default :
필드의 기본값을 지정한다. default="WE"
db_column :
컬럼명을 기본값이 아닌, 다른 값으로 지정한다. db_column="ME"
verbose_name :
겉으로 보여줄 필드 이름을 정한다. varbose_name="내용"
validators :
입력값을 검사할 함수 지정.
필드마다 기본으로 지정되어 있기도함
( 이메일만 받기, 최대길이, 최소길이, 최대값, 최소값 등등 )
choices (form widget용) :
select box 소스로 사용
help_text(form widget용) :
필드 입력 도움말
auto_now_add :
auto_now_add=True 이면, 레코드 생성시 현재시간으로 자동저장
👉 Model 작성시 주의 사항
- blank(공백), null(빈값), default(기본값) 설정은 값이 필수적인지, 아닌지 체크하는데 기본요소로 작용하므로 매번 유의해서 설정 해주어야 한다.
👉 Model을 기반으로, DB 적용하기 위한 sql 형식의 자료(마이그레이션) 만들기
# Django 앱 내부에, migrations 폴더 만들고, 테이블 생성을 위한 파일 생성
python manage.py makemigrations
👉 마이그레이션 파일(__init__.py) 생성
👉 마이그레이션 기반으로 실제 DB에 적용하기
# 테이블 스키마를 이용해, 실제 DB에 적용하기 위한 명령 실행
python manage.py migrate
👉 Template란?
- MVC 모델에서 V(View)의 역할을 담당
- View에서 데이터를 전달받아 화면에 표출한다.
- <앱>/templates 폴더 안의 내용을 감지한다.
👉 Template 기본 사용법( <앱>/templates/<이름>.html )
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{# 주석 : {#주석#} 형식으로, 주석을 넣는다. #}
{# 템플릿 변수 : {{변수}} 형식으로, views.py에서 인자를 받아온다 #}
<h1>THis is index1, {{message}}</h1>
{# 템플릿 태그 : {%명령%} 형식으로, python 명령을 실행한다 ( if, for 등등 ) #}
{% if count > 0 %}
Data Conunt = {{ count }}
{% else %}
No Data
{# 템플릿 필터 : {{변수|포맷}} 형식으로, 오늘날짜를 넣거나, 대소문자 변환을 하는 등 여러 작업가능 #}
{{ createDate|date:"Y-m-d" }}
{{ lastNam|lower }}
{# HTML Escape : <, >, ', ", & 등과 같은 문자들이 있을 경우 이를 HTML요소로 변환해줌 #}
{% autoescape on %}
{{ content }} {# content 변수에 <, >, ', "가 들어있다고 가정 #}
{% endautoescape %}
{{ content|excape }}
{# HTML 인코딩 변환도구를 이용해, 변수를 미리 html 요소로 바꾸어 전달하는 법도 있다 #}
</body>
</html>
👉 View란?
- MVC 모델에서 C(Controller)의 역할을 담당한다.
- Model에서 데이터를 가져와, 적절하게 정리한다.
- 정리한 데이터를 Template에게 전달한다.
- 각 함수가 하나의 View를 정의한다.
- HTTP 요청(Request)을 입력받고, HTTP 응답(Response)를 돌려준다.
👉 URL로 화면 조절하기(<프로젝트>/urls.py)
# django 기본화면 불러오는 모듈
from django.contrib import admin
# 경로 설정을 위한 path 함수 불러오기
from django.urls import path
# 만든 앱에서 화면(views.py) 불러오기
from <앱> import views
# url뒤에 ''(공백)찾고, views.py안에 post_list실행
# ex) localhost:8000/ => views.post_list()
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.post_list, name='post_list'),
]
👉 View에서 실행할 함수를 만들고, Template로 정보 전달하기(<앱>/views.py)
from django.shortcuts import render
# render(request, <템플릿>, <전달데이터>) 형식으로 사용
def post_list(request):
# 쿼리셋 이용해 Post를 불러온다 (published_date가 현재시간보다 작거나 같은 Post, 시간기준 오름차순 정렬)
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
# <앱>/templates/post_list.html 파일에, 'posts'란 이름으로 posts 전달
return render(request, '<앱>/post_list.html', {'posts':posts})
🚨 흐름 정리
1. user가 localhost:8080/test 로 이동을 요청
2. 내가 만든 프로젝트/urls.py 로 이동(urls.py 파일은 요청 시 가장 먼저 호출 되는 파일)
3. urlpatterns 변수에서 매핑하고, url과 view 함수를 연결
4. views.py로 이동
(1) Local Server 에 해당 페이지 요청 Local Server
http://localhost:8000/test/ ---------------------------------------------------------
[ My Web ] ---------> | [config/urls.py] (2) 분석 [test/views.py] |
▲ | test/ -> views.index -----> def index(request) |
| | |
| | |
| | True config/urls.py = call index |
| | False config/urls.py = http404 |
| | |
| --------------------------------------------------------
| |
| (3) Result = Views.py def index(request) |
----------------------------------------------------------------
- 사용자는 웹 브라우저 주소창에 localhost:8000/test/ 페이지를 Request 한다.
- Local Server에서는 (config[내가 만든 프로젝트]/urls.py) URL을 해석해 test/views.py 파일의 index function을 호출하고
- test/views.py에서 index function을 실행하고 그 결과를 웹 브라우저에게 전달 하는 과정이다.
'Language > Python' 카테고리의 다른 글
| Python [Django] - DRF게시판 만들기(2) (0) | 2023.10.25 |
|---|---|
| DRF(Django REST Framework) (0) | 2023.10.25 |
| Python [Django] - DRF게시판 만들기(1) (0) | 2023.10.23 |