Search

django

대분류
프레임워크
소분류
Python Module
유형
웹 앱 프레임워크
주요 레퍼런스
https://djangojeng-e.github.io/
https://github.com/good593/course_web_development/tree/main/4.%20backend/python/Django
모듈 분류
외장
최종 편집 일시
2024/10/27 15:30
생성 일시
2024/07/22 03:49
13 more properties
목차

설명

Python 기반의 오픈 소스 웹 애플리케이션 프레임워크(Web Application Framework) 프론트엔드(Front-end) 개발과 Server, DB 등과 관련된 백엔드(Back-end) 개발 가능

MTV 패턴

장고는 MVC(Model-View-Controller)를 기반으로 한 프레임워크다. 하지만 장고에서는 같은 개념을 MTV(Model - Template - View)라고 부른다.
장고의 기본 구성은 Model, Template, View인 MTV 패턴
Model : 데이터에 관한 정보(저장, 접근, 검증, 작동 등)를 처리하고 논리 및 규칙을 직접 관리
모델
Template : 데이터가 어떻게 표시되는 지를 정의. 템플릿은 사용자에게 실제로 보여지는 웹 페이지나 문서를 작성
템플릿
View : 어떤 데이터를 표시할지 정의, HTTP 응답 상태 코드를 반환
데이터베이스에서 관리할 데이터를 정의(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로 이동한다
검증 실패 시, 오류 메세지와 함꼐 입력폼을 다시 보여준다