목차
설명
Python 기반의 오픈 소스 웹 애플리케이션 프레임워크(Web Application Framework)
프론트엔드(Front-end) 개발과 Server, DB 등과 관련된 백엔드(Back-end) 개발 가능
MTV 패턴
•
장고는 MVC(Model-View-Controller)를 기반으로 한 프레임워크다. 하지만 장고에서는 같은 개념을 MTV(Model - Template - View)라고 부른다.
Django 작동원리
설치
기본 설치
1.
장고 프로젝트 생성
> python -m pip install --upgrade pip
> pip install django
> mkdir <프로젝트명>
> cd <프로젝트명>
> django-admin startproject config . # config폴더에 셋팅파일을 생성
Shell
복사
2.
앱 생성
> cd 프로젝트명
> python manage.py startapp 앱명
Shell
복사
3.
config/settings.py에 앱 설정 추가
# 추가한 앱을 등록/선언하는 코드
INSTALLED_APPS = [
"django.contrib.admin", # 장고의 관리자 기능을 사용하기 위한 패키지
"django.contrib.auth", # 장고의 인증 기능을 사용하기 위한 패키지
"django.contrib.contenttypes", # 장고의 컨텐츠 타입을 사용하기 위한 패키지
"django.contrib.sessions", # 장고의 세션 기능을 사용하기 위한 패키지
"django.contrib.messages", # 장고의 메시지 프레임워크를 사용하기 위한 패키지
"django.contrib.staticfiles", # 장고의 정적 파일을 사용하기 위한 패키지
"<내가 만든 앱 1>", # 앱을 사용하기 위한 패키지
"<내가 만든 앱 2>", # 앱을 사용하기 위한 패키지
]
Python
복사
4.
templates 설정
> cd 프로젝트명
> mkdir templates
> cd templates
> mkdir 앱명
Shell
복사
5.
config/settings.py에 templates path 설정 추가
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates", # 장고의 템플릿 엔진을 사용하기 위한 백엔드 설정
"DIRS": ["templates"], # 템플릿 파일이 위치한 디렉토리 설정
"APP_DIRS": True, # 앱 디렉토리에 있는 템플릿 파일을 사용할 수 있도록 설정
"OPTIONS": { # 추가적인 설정을 위한 옵션 설정
"context_processors": [ # 템플릿에서 사용할 수 있는 컨텍스트 프로세서 설정
"django.template.context_processors.debug", # 디버그 모드 설정
"django.template.context_processors.request", # request 객체 설정
"django.contrib.auth.context_processors.auth", # 사용자 인증 설정
"django.contrib.messages.context_processors.messages", # 메시지 프레임워크 설정
],
},
},
]
Python
복사
6.
static 설정
> cd 프로젝트명
> mkdir static
> cd static
> mkdir css
> mkdir js
Shell
복사
7.
config/settings.py에 static path 설정 추가
import os
STATIC_PATH = os.path.join(
BASE_DIR, "static"
) # concatena a pasta static a variavel instanciada base_dir que aponta para a raiz do projeto
STATICFILES_DIRS = (STATIC_PATH,)
Python
복사
8.
서버 기동
> python manage.py runserver
Shell
복사
구조
•
디렉토리 구조
◦
manage.py:
▪
Django 프로젝트의 관리 명령을 실행하는 스크립트
▪
서버 실행, 데이터베이스 마이그레이션, 애플리케이션 시작 등을 수행할 수 있다.
◦
config/:
▪
Django 프로젝트 설정 파일 저장 디렉토리
▪
config/settings.py:
•
Django 프로젝트의 설정 파일
•
데이터베이스 설정, 템플릿 경로, 미들웨어 등 프로젝트의 전반적인 설정을 정의
▪
config/urls.py:
•
URL 패턴을 정의하는 파일
•
요청된 URL을 적절한 뷰에 매핑
▪
config/wsgi.py:
•
WSGI(웹 서버 게이트웨이 인터페이스) 애플리케이션을 위한 설정 파일
•
배포 시 서버가 Django 애플리케이션을 호출하는 데 사용
•
wsgi서버는 호출 가능한 애플리케이션 경로를 얻는다.
⇒ django의 default server(runserver)는 이 경로를 settings.py에 있는 WSGI_APPLICATION에서 얻는다.
WSGI(Web Server Gateway Interface)
웹 서버와 통신하기 위한 표준 인터페이스, 파이썬 프레임워크
◦
app1/ 및 app2/:
▪
각 앱은 독립적인 기능 모듈을 의미
▪
여러 앱을 프로젝트에 추가하여 기능 모듈화 가능
▪
각각의 앱에는 다음과 같은 파일이 포함될 수 있다:
•
__init__.py: Python 패키지로 인식되게 하는 파일
•
admin.py: Django 관리자 페이지에서 앱의 모델을 설정하는 파일
•
apps.py: 앱의 설정을 정의하는 파일
•
models.py: 데이터베이스 모델을 정의하는 파일
•
tests.py: 앱의 테스트 케이스를 작성하는 파일
•
urls.py: URL 패턴 정리 파일
•
views.py: 요청을 처리하고 응답을 반환하는 뷰를 정의하는 파일
◦
templates/:
▪
HTML 템플릿 파일이 위치하는 디렉토리
▪
settings.py에서 템플릿 디렉토리 경로를 설정할 수 있다.
◦
static/:
▪
CSS, JavaScript, 이미지 등의 정적 파일을 저장하는 디렉토리
▪
이 파일들은 웹 서버를 통해 클라이언트에 제공
필수 참고 요소
HttpRequest 객체 → 웹 View 함수 전달
주요 객체
1.
request.method
•
요청 방식 (GET, POST, PUT, DELETE 등)을 반환
•
예: request.method는 'GET' 또는 'POST'와 같은 값을 가진다.
2.
request.GET
•
GET 요청에서 URL 쿼리 매개변수를 포함하는 QueryDict 객체
•
예: /search/?q=django에서 request.GET['q']는 'django'를 반환
3.
request.POST
•
POST 요청에서 폼 데이터 또는 데이터 바디를 포함하는 QueryDict 객체
•
예: <form method="post"><input name="username" value="admin"></form>에서 request.POST['username']은 'admin'을 반환
4.
request.FILES
•
파일 업로드와 관련된 데이터를 포함하는 MultiValueDict 객체
•
예: <input type="file" name="profile_picture">에서 request.FILES['profile_picture']는 업로드된 파일을 표시
5.
request.COOKIES
•
클라이언트의 쿠키를 포함하는 딕셔너리
•
예: request.COOKIES['sessionid']는 'abcdef123456'과 같은 세션 ID 값을 반환
6.
request.META
•
HTTP 헤더와 관련된 메타 정보를 포함하는 딕셔너리
•
예: request.META['HTTP_USER_AGENT']는 사용자의 브라우저 정보를 반환
7.
request.path
•
요청된 URL 경로를 반환
•
예: /articles/2024/08/는 '/articles/2024/08/'를 반환
8.
request.get_full_path()
•
요청된 전체 경로와 쿼리 문자열을 포함한 URL을 반환
•
예: /search/?q=django는 '/search/?q=django'를 반환
9.
request.session
•
세션 데이터를 저장하거나 검색하는 데 사용되는 객체
•
예: request.session['user_id'] = 42는 세션에 사용자 ID를 저장
10.
request.user
•
현재 요청의 사용자 정보(User 객체)
•
인증된 사용자일 경우 User 객체가 반환
•
비인증 사용자일 경우 AnonymousUser 객체가 반환
11.
request.is_secure()
•
요청이 HTTPS로 전송되었는지 여부를 반환.
•
True 또는 False
주요 메서드
1.
request.METHOD.get()
•
request.GET 또는 request.POST에서 특정 매개변수를 검색할 때 사용
•
예: request.GET.get('q', 'default')는 'q' 매개변수가 없으면 'default'를 반환
2.
request.POST.getlist()
•
POST 요청에서 여러 값을 가진 폼 필드를 가져올 때 사용합니다.
•
예: request.POST.getlist('tags')는 'tags' 필드의 모든 값을 리스트로 반환
django.shortcuts
render()
render(request, template_name, context=None, content_type=None, status=None, using=None)
Python
복사
•
용도: 템플릿을 렌더링하여 HTML 페이지를 생성하고 반환
•
매개변수:
◦
request: 현재의 HTTP 요청 객체.
◦
template_name: 렌더링할 템플릿 파일의 경로.
◦
context: 템플릿에 전달할 데이터 딕셔너리.
◦
content_type: 응답의 MIME 타입 (기본값은 text/html).
◦
status: 응답의 HTTP 상태 코드 (기본값은 200 OK).
◦
using: 사용할 템플릿 엔진 (기본값은 기본 템플릿 엔진).
•
예시:
python코드 복사
from django.shortcuts import render
def my_view(request):
context = {'key': 'value'}
return render(request, 'my_template.html', context)
Python
복사
redirect()
redirect(to, *args, permanent=False, **kwargs)
Python
복사
•
용도: 클라이언트를 다른 URL로 리다이렉션
•
매개변수:
◦
to: 리디렉션할 URL 패턴 이름 또는 URL 문자열.
◦
permanent: True이면 301 Moved Permanently 상태 코드를 사용하고, False이면 302 Found 상태 코드를 사용
◦
args 및 *kwargs: URL 패턴에 인수를 전달할 때 사용
•
예시:
python코드 복사
from django.shortcuts import redirect
def my_view(request):
return redirect('another-view-name')
Python
복사
get_object_or_404()
get_object_or_404(klass, *args, **kwargs)
Python
복사
•
용도: 주어진 모델 인스턴스를 데이터베이스에서 가져온다.
•
인스턴스가 존재하지 않으면 Http404 예외를 발생
•
매개변수:
◦
klass: 검색할 모델 클래스.
◦
args, *kwargs: 모델 인스턴스를 식별하기 위한 필터링 조건.
•
예시:
python코드 복사
from django.shortcuts import get_object_or_404
from .models import MyModel
def my_view(request, id):
obj = get_object_or_404(MyModel, id=id)
return render(request, 'my_template.html', {'object': obj})
Python
복사
get_list_or_404()
•
get_list_or_404(klass, *args, **kwargs)
◦
용도: 주어진 모델 인스턴스 리스트를 데이터베이스에서 가져옵니다. 리스트가 비어있으면 Http404 예외를 발생
◦
매개변수:
▪
klass: 검색할 모델 클래스.
▪
args, *kwargs: 모델 인스턴스를 필터링하기 위한 조건.
◦
예시:
python코드 복사
from django.shortcuts import get_list_or_404
from .models import MyModel
def my_view(request):
objects = get_list_or_404(MyModel, some_field='value')
return render(request, 'my_template.html', {'objects': objects})
Python
복사
HttpRespose()
•
HttpResponse
◦
용도: HTTP 응답을 직접 생성할 때 사용
◦
매개변수:
▪
content: 응답의 내용 (문자열, 바이트 문자열 등).
▪
content_type: 응답의 MIME 타입 (기본값은 text/html).
▪
status: 응답의 HTTP 상태 코드 (기본값은 200 OK).
◦
예시:
python코드 복사
from django.http import HttpResponse
def my_view(request):
return HttpResponse("Hello, world!")
Python
복사
HttpResponseRedirect()
•
HttpResponseRedirect
◦
용도: HTTP 리디렉션 응답을 생성
◦
매개변수:
▪
redirect_to: 리디렉션할 URL 문자열.
◦
예시:
python코드 복사
from django.http import HttpResponseRedirect
def my_view(request):
return HttpResponseRedirect('/some-url/')
Python
복사
관리자 기능
관리자 페이지 / sqlite 설정
1. Create Django
•
가상환경 셋팅
•
장고 프로젝트 생성
•
장고 앱 생성
•
templates 설정
•
static 설정
2. 서버 기동
•
마이그레이션(migration)
◦
테이블 및 필드의 생성, 삭제, 변경 등과 같은 스키마 정보에 대한 변경사항을 저장(기억)
◦
app 폴더 아래에 migrations 폴더에 마이그레이션 정보 저장
> python manage.py makemigrations
Python
복사
•
Database에 마이그레이션 정보 반영
◦
마이크레이션에 저장된 스키마 정보를 이용하여 Database의 테이블 생성/삭제/변경 진행
> python manage.py migrate
Python
복사
•
server 실행
> python manage.py runserver
Python
복사
3. 관리자 페이지 접속하기
•
config.urls.py
◦
관리자 페이지 접속 정보를 확인할 수 있음
from django.contrib import admin
from django.urls import path
urlpatterns = [
path("admin/", admin.site.urls),
]
Python
복사
4. 관리자 계정 생성을 위한 테이블 생성
•
Database에 마이그레이션 정보 반영
◦
마이크레이션에 저장된 스키마 정보를 이용하여 Database의 테이블 생성/삭제/변경 진행
> python manage.py migrate
Shell
복사
5. SQLite DB에 생성된 테이블 확인
SQLite : 파이썬 내장 데이터베이스
6. Superuser 만들기
•
관리자 사이트에 로그인하기 위해서는, 직원(Staff) 상태가 활성화 된 사용자 계정이 있어야 합니다.
•
레코드들을 보고 생성하기 위해서는 이 사용자가 모든 객체들을 관리하기 위한 허가가 있어야 합니다.
•
사이트에 대한 모든 접속 권한과 필요한 허가를 가진 "superuser" 계정을 manage.py를 사용해서 만들 수 있습니다.
> python manage.py createsuperuser
Shell
복사
7. 관리자 페이지 접속 및 로그인하기
> python manage.py runserver
Shell
복사
8. admin 계정 비번 변경
> python manage.py changepassword admin
Shell
복사
관리자 페이지에서 사용자 생성하기
1. Users 페이지 이동
2. 사용자 생성하기
3. 사용자 확인
•
SQLite DB에서 확인
Models(스키마) 등록하기
1. Model(스키마) 정의/생성
•
todolist.models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class todo(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
todo_name = models.CharField(max_length=1000)
status = models.BooleanField(default=False)
def __str__(self):
return self.todo_name
Python
복사
2. Model 등록하기
•
todolist.admin.py
from django.contrib import admin
from .models import todo
# Register your models here.
admin.site.register(todo)
Python
복사
3. 변경된 스키마 적용 및 서비 실행
•
마이그레이션(migration)
◦
테이블 및 필드의 생성, 삭제, 변경 등과 같은 스키마 정보에 대한 변경사항을 저장(기억)
◦
app 폴더 아래에 migrations 폴더에 마이그레이션 정보 저장
> python manage.py makemigrations
Plain Text
복사
•
Database에 마이그레이션 정보 반영
◦
마이크레이션에 저장된 스키마 정보를 이용하여 Database의 테이블 생성/삭제/변경 진행
> python manage.py migrate
Shell
복사
•
server 실행 및 관리자 페이지 접속
> python manage.py runserver
Shell
복사
SQL 기능
mysql 연결
1. dbeaver에서 DB 및 사용자 생성&권한 부여
-- 데이터베이스 생성
create database django_db;
show databases;
-- 사용자 계정 생성
use mysql;
create user 'django_root'@'%' identified by 'django_root1!';
select * from user;
-- 사용자 권한 부여
grant all privileges on django_db.* to 'django_root'@'%';
flush privileges; -- 새로운(수정된) 권한 적용
------ 삭제 명령 ------
-- 사용자 계정 삭제
drop user 'django_root'@'%';
select * from user;
-- 데이터베이스 삭제
drop database if exists django_db;
show databases;
SQL
복사
2. mysql 드라이버 설치
> pip install pymysql
Shell
복사
3. config/settings.py에 mysql 설정 추가
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "django_db", # 데이터베이스 이름
"USER": "django_root", # 유저 아이디
"PASSWORD": "django_root1!", # 유저 비번
"HOST": "localhost", # host 주소
"PORT": "3306" # port 번호
}
}
Python
복사
Models
•
모델은 데이터에 대한 단 하나의 정보 소스
•
모델은 저장하고 있는 데이터의 필수적인 필드와 동작을 포함
•
일반적으로, 각각의 모델은 하나의 데이터베이스 테이블에 매핑
1. todo 생성
•
todoList.models.py
from django.db import models
# Create your models here.
class todo(models.Model):
todo_name = models.CharField(max_length=1000)
status = models.BooleanField(default=False)
def __str__(self):
return self.todo_name
Python
복사
2. 마이그레이션(migration)
•
테이블 및 필드의 생성, 삭제, 변경 등과 같은 스키마 정보에 대한 변경사항을 저장(기억)
•
app 폴더 아래에 migrations 폴더에 마이그레이션 정보 저장
> python manage.py makemigrations
Shell
복사
3. Database에 마이그레이션 정보 반영
•
마이크레이션에 저장된 스키마 정보를 이용하여 Database의 테이블 생성/삭제/변경 진행
> python manage.py migrate
Shell
복사
•
mysql 테이블 조회
show tables;
SQL
복사
Django 관리자
1. Admin 계정
•
admin 생성
python manage.py createsuperuser
Shell
복사
2. Model 등록
•
todolist.admin.py
from django.contrib import admin
from .models import todo
# Register your models here.
admin.site.register(todo)
Python
복사
view
1. views 정의
•
todolist.views.py
2. 앱 urls에 추가
•
파일 생성: todolist.urls.py
from django.urls import path
from .views import todo_list, delete_task, update_task
urlpatterns = [
path("", todo_list, name="todo-list"),
path("delete-task/<str:task>", delete_task, name="delete-task"),
path("update-task/<str:task>", update_task, name="update-task"),
]
Python
복사
3. config(프로젝트) urls에 추가
•
config.urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("todolist.urls")),
]
Python
복사
templates
•
templates/todolist/todo.html
서비 실행
•
마이그레이션(migration)
> python manage.py makemigrations
Shell
복사
•
Database에 마이그레이션 정보 반영
> python manage.py migrate
Shell
복사
•
server 실행 및 관리자 페이지 접속
> python manage.py runserver
Shell
복사
테스트 결과
Django 인증/인가 기능
사용자 생성
from django.contrib.auth.models import User
user = User.objects.create_user("john", "lennon@thebeatles.com", "johnpassword")
# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
user.last_name = "Lennon"
user.save()
Shell
복사
인증
사용자 인증하기
from django.contrib.auth import authenticate
user = authenticate(username="john", password="secret")
if user is not None:
# A backend authenticated the credentials
...
else:
# No backend authenticated the credentials
...
Python
복사
웹 요청 인증하기
if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
Python
복사
인가
로그인한 사용자의 접근 제한하기
•
기본 방법
from django.conf import settings
from django.shortcuts import redirect
def my_view(request):
if not request.user.is_authenticated:
return redirect(f"{settings.LOGIN_URL}?next={request.path}")
# ...
Python
복사
•
데코레이션 방법
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request): ...
Python
복사
로그인/로그아웃
사용자 로그인 방법
# app/views.py
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST["username"]
password = request.POST["password"]
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
Python
복사
사용자 로그아웃 방법
# app/views.py
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
Python
복사
프로젝트 실행
1. 마이그레이션(migration)
> python manage.py makemigrations
Python
복사
2. Database에 마이그레이션 정보 반영
> python manage.py migrate
Python
복사
3. Superuser 만들기
> python manage.py createsuperuser
Python
복사
4. server 실행 및 관리자 페이지 접속
> python manage.py runserver
Python
복사
Custom User Model
Class
BassUserManager
•
User를 생성할 때 사용하기 위해서 상속받아야하는 클래스
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
...
Python
복사
◦
create_user(): User 생성하는 메서드
class UserManager(BaseUserManager):
def create_user(self, email, nickname, password=None):
...
Python
복사
◦
create_superuser(): 관리자 User 생성하는 메서드
class UserManager(BaseUserManager):
def create_superuser(self, email, nickname,password ):
...
Python
복사
AbstractBaseUser
•
사용자 모델(User) 클래스를 생성하기 위해서 상속받아야 하는 클래스
•
USERNAME_FIELD
◦
user model에서 사용할 고유 식별자로 필수로 입력해 주어야 한다.
•
REQUIRED_FIELDS
◦
user model 에서 요구되는 필드의 모두 포함합니다만 “USERNAME_FIELD” 혹은 “Password” 필드는 제외
from django.contrib.auth.models import AbstractBaseUser
class User(AbstractBaseUser):
identifier = models.CharField(max_length=40, unique=True)
date_of_birth = models.DateField()
height = models.FloatField()
...
USERNAME_FIELD = "identifier"
REQUIRED_FIELDS = ["date_of_birth", "height"]
Python
복사
PermissionsMixin
•
Django에서 제공하는 사용자 권한을 사용하기 위해서 상속받아야 하는 클래스
•
is_superuser
◦
불리언. 명시적으로 할당하지 않고 모든 권한을 사용자가 갖도록 지정
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
class User(AbstractBaseUser,PermissionsMixin):
is_superuser = models.BooleanField(default=False)
...
Python
복사
settings.py
•
AUTH_USER_MODEL = '[앱명].[커스텀 모델명]'
AUTH_USER_MODEL = "user.User"
Python
복사
Forms
•
폼은 쉽게 말해 페이지 요청 시 전달되는 파라미터들을 쉽게 관리하기 위해 사용하는 클래스
•
폼은 필수 파라미터의 값이 누락되지 않았는지, 파라미터의 형식은 적절한지 등을 검증할 목적으로 사용
•
이 외에도 HTML을 자동으로 생성하거나 폼에 연결된 모델을 이용하여 데이터를 저장하는 기능 존재
Django Forms 처리 프로세스
•
GET
◦
방식입력폼을 보여준다
•
POST
◦
방식테이터를 입력 받아 유효성 검증 과정을 거친다
▪
검증 성공 시, 해당 데이터를 저장하고 SUCESS URL로 이동한다
▪
검증 실패 시, 오류 메세지와 함꼐 입력폼을 다시 보여준다