728x90

**Django

(with pycharm)

 

-- Django (Python Full stack Web Framework)

 

  • Django(/dʒæŋɡoʊ/ jang-goh/쟁고/장고)는 Python으로 맊들어짂 무료 오픈소스 웹 애플리케이션 프레임워크(web application framework)

  • 쉽고 빠르게 웹사이트를 개발할 수 있도록 돕는 구성요소로 이루어진 웹 프레임워크

  • 백엔드를 담당하는 파이썬 풀스택 웹프레임워크 Lawrence Journal-World 싞문사에서 2003년부터 개발하여, 2005년에 세상에 공개

  • 2008년에 1.0 릴리즈 (Django Roadmap)

  • 기타리스트 Django Reinhardt 이름을 따서, Django (쟁고, 장고)

  • Django 와 비슷한 웹프레임워크들

    • Flask : a micro framework for Python based on Werkzeug.

    • Pyramid : a small, fast, down-to-earth,

    • Bottle : a fast and simple micro framework for small web-applications

 

 

**웹 어플리케이션 기본 구조

 

**Django 기본구조

urls.py, view.py, models.py, templates/blog/post_list.html

web server -> Apache, NginX

Django는 sqlite가 내장되어있음 -> 추후에 MariaDB사용

 

 

**Static Web Application(정적인 웹)

**Dynamic Web Application(동적인 웹) - db 와 연동을 함

 

 

"Seperation of concerns(responsibility)" : 관심사(책임)의 분리

-- MVC 패턴 (Spring MVC 프레임워크)

  • model-view-controller

 

-- MTV 패턴 (Django 프레임워크)

  • MTV(Model Template View) 패턴

1) Model : 테이블을 정의한다.

2) Template : 사용자가 보게 될 화면의 모습을 정의한다.

3) View : 애플리케이션의 제어 흐름 및 처리 로직을 정의한다.

모델은 model.py파일에, 템플릿은 templates 디렉토리 하위의 *.html 파일에,

뷰는 views.py 파일에 작성하도록 처음부터 뼈대를 만들어 줍니다.

 

  • 모델,템플릿,뷰 모듈 갂에 독립성을 유지할 수 있고, 소프트웨어 개발의 중요한 원칙인 느슨한 결합(Loose Coupling) 설계의 원칙에도 부합된다.

  • Django에서 프로젝트를 생성하기 위해 startproject 및 startapp 명령을 실행하면 자동으로 프로젝트 뼈대(skeleton)에 해당하는 디렉토리와 파일들을 만들어 줍니다.

 

-- Django’s Architecture

 

Django’s Structure – A Heretic’s Eye View - Python Django

Learn how Django is a very logically structured framework built on Python, that isn't complex or hard to understand once you know how it all fits together.

djangobook.com

 

**ORM(Object Relational Mapping)

: 객체를 RDB의 Table로 매핑

: Mapping Rule

    Model Class <-> Table

    Object <-> Row(Record), 행

    Variable <-> Column, 열

 

pip install django

django-admin --version

 

mypython 폴더 아래에 myjango 하위 폴더를 생성한다.

# Django 프로젝트 생성

mypython> django-admin startproject mydjango .

    => django/conf/project_template 구성으로 생성 됨 #src

  • manage.py : 웹사이트 관리를 도와주는 역할을 하는 파읷

  • settings.py : 웹사이트 설정이 있는 파읷

  • urls.py : urlresolver가 사용하는 요청 패턴(URL규칙) 목록을

    포함하고 있는 파읷

  • wsgi.py : Web Server Gateway Interface이며 Python의 표준

    Gateway Interface 입니다.

  • asgi.py : Asynchronous Server Gateway Interface

    WSGI와 비슷한 구조를 가지며, 비동기 통싞을 지원한다.

 

 

# settings.py의 LANGUAGE_CODE와 TIME_ZONE 변경하기

**mydjango/settings.py

LANGUAGE_CODE = 'ko'

TIME_ZONE = 'Asia/Seoul'

 

# settings.py에 정적 파읷 경로를 추가함 STATIC_URL항목 바로 아래에 STATIC_ROOT을 추가

**mydjango/settings.py

import os

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, STATIC_URL)

 

# 데이터베이스를 생성

django_src> python manage.py migrate

    => db.sqlite3 파일이 생성됨

# Server 시작

    django_src> python manage.py runserver

# Superuser 계정 생성

django_src> python manage.py createsuperuser

=> password를 체크 하므로 너무 짧거나 간단한 글자로 입력하면 안됩니다.

http://localhost:8000/admin/ 으로 접속

 

id = admin /password = djangoadmin

 

 


--Blog App 작성 : Model클래스와 테이블

 

-- Django Model

1) Django 내장 ORM(Object Relational Mapping) ( https://docs.djangoproject.com/en/3.0/topics/db/models/ )

 

Models | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

2) SQL을 직접 작성하지 않아도, Django Model을 통해 데이터베이스로의 접근 가능 (조회/추가/수정/삭제)

3) <Python 클래스> 와 <데이터베이스 테이블> 을 매핑

• Model : DB 테이블과 매핑

• Model Instance : DB 테이블의 1 Row

• blog앱 Post모델 : blog_post 데이터베이스 테이블과 매핑

• blog앱 Comment모델 : blog_comment 데이터베이스 테이블과 매핑

 

 

-- 첫번째 앱 <blog> 앱 생성

1) App 디렉토리 생성 django_src> python manage.py startapp blog

django/conf/app_template 구성으로 App 디렉토리가 생성되어진다. #src

2) App을 프로젝트에 등록 : 아래와 같이 mydjango/settings.py을 편집하여,

INSTALLED_APPS 항목 끝에 blog App 이름을 추가한다.

# mydjango/settings.py 파일

    INSTALLED_APPS = [

    # 생략

    'blog',

]

 

-- blog앱 글(Post) Model 만들기

1) Post(게시글)의 속성들

    title(제목)

    text(내용)

    author(글쓴이)

    created_date(작성일)

    published_date(게시일)

2) Model 객체는 blog/models.py 파읷에 선언하여 모델을 만듭니다. 이 Model을 저장하면 그 내용이 데이터베이스에 저장되는 것입니다.

 

 

-- Django Model

1) 커스텀 모델 정의 (blog/models.py)

2) 데이터베이스 테이블 구조/타입을 먼저 설계를 한 다음에 모델 정의

모델 클래스명은 단수형 (Posts가 아니라, Post)

 

from django.db import models
class Post(models.Model):
    title = models.CharField(max_length=100)    
    content = models.TextField()   
    created_at = models.DateTimeField(auto_now_add=True)   
    updated_at = models.DateTimeField(auto_now=True)

 

 

-- 지원하는 모델필드 타입 #ref

1) Field Types :

    AutoField, BigInteger, BinaryField,BooleanField, CharField, DateField, DateTimeField,DecimalField, DurationField, EmailField,        FileField,ImageField, IntegerField, GenericIPAddressField, PositiveIntegerField, PositiveSmallIntegerfield, SlugField, TextField,      URLField, UUIDField 등

2) Relationship Types :

    ForeignKey, ManyToManyField, OneToOneField

 

 

-- 데이터 타입 매핑

1) 파이썬 데이터타입과 데이터베이스 데이터타입을 매핑 :

 AutoField (int), BinaryField (bytes), BooleanField (bool), NullBooleanField (None, bool), CharField/TextField/                         EmailField/GenericIPAddressField/SlugField/URLField(str)

2) 같은 파이썬 데이터 타입에 매핑 되더라도,"데이터 형식" 에 따라 여러 Model Field Types 로 나뉨.

 

 

 

-- 필드 옵션

1) 자주 쓰는 필드 옵션 :

    null (DB 옵션) : DB 필드에 NULL 허용 여부 (디폴트 : False)

    unique (DB 옵션) : 유일성 여부

    blank : 입력값 유효성(validation)검사할 때 empty값 허용여부(디폴트:False)

    default : 디폴트 값 지정. 값이 지정되지 않았을 때 사용

    choices (form widget 용) : select box 소스로 사용

    validators : 입력값 유효성 검사를 수행할 함수를 다수 지정

         각 필드마다 고유한 validators 들이 이미 등록되어 있기도 함.

         ex) 이메일만 받기, 최대길이 제한, 최소길이 제한, 최대값 제한, 최소값 제한, etc.

    verbose_name : 필드 레이블. 지정되지 않으면 필드명이 쓰여짐.

    help_text (form widget 용) : 필드 입력 도움말

 

-- blog앱 글(Post) Model 만들기

**blog/models.py

from django.db import models
from django.utils import timezone

class Post(models.Model):    
    author = models.ForeignKey('auth.User',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)
    
    def publish(self): 
        self.published_date = timezone.now() 
        self.save()
        
    def __str__(self): 
        return self.title

 

 

-- DB에 테이블 만들기

1) 마이그레이션 파일(migration file) 생성하기

django_src> python manage.py makemigrations blog

Migrations for 'blog':

    blog\migrations\0001_initial.py

         - Create model Post

2) 실제 데이터베이스에 Model 추가를 반영하기

django_src> python manage.py migrate blog

Operations to perform:

    Apply all migrations: blog

Running migrations:

    Applying blog.0001_initial... OK

 

 

-- Django Admin(관리자)

1) 관리자 페이지에서 만든 모델을 보기 위해 Post 모델을 등록

**blog/admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

 

2) 관리자 화면에서 확인하기

http://localhost:8000/admin/ 으로 접속

 

 

 

-- Migrations #ref

• django-south(https://south.readthedocs.io/en/latest/) 프로젝트가 킥스타터 펀딩 (£17,952, 507 Backers)을 통해, Django 1.7에 포함

 

South documentation — South 1.0 documentation

South is a tool to provide consistent, easy-to-use and database-agnostic migrations for Django applications.

south.readthedocs.io

모델 변경내역 히스토리 관리

모델의 변경내역을 Database Schema (데이터베이스 데이터 구조)로 반영시키는 효율적인 방법을 제공

• 관련 명령

    쉘> python manage.py makemigrations <app-name> # 마이그레이션 파일 생성

    쉘> python manage.py migrate <app-name> # 마이그레이션 적용

    쉘> python manage.py showmigrations <app-name> # 마이그레이션 적용 현황

    쉘> python manage.py sqlmigrate <app-name> <migration-name> # 지정 마이그레이션의 SQL 내역

 

--migration 파일 생성 및 적용

1. 마이그레이션 파일 (초안) 생성하기 : makemigrations 명령

2. 해당 마이그레이션 파일을 DB에 반영하기 : migrate 명령

 

-- Migrate (Forward/Backward)

쉘> python manage.py migrate <app-name>

    미적용 <마이그레이션 파일> 부터 <최근 마이그레이션 파일> 까지

    "Forward 마이그레이션" 이 순차적으로 수행

쉘> python manage.py migrate <app-name> <마이그레이션 파일명>

    <지정된 마이그레이션 파일> 이 <현재 적용된 마이그레이션> 보다

    이후이면, "Forward 마이그레이션" 이 순차적으로 수행

    이전이면, "Backward 마이그레이션" 이 순차적으로 수행 (롤백)

 

  • 전체 파일명을 지정 하지 않더라도, 유일한 1개의 파일명을 판독 가능하면, 파일명 일부로도 지정 가능

blog/migrations/0001_initial.py

blog/migrations/0002_create_field.py

blog/migrations/0002_update_field.py

python manage.py migrate blog 000 # FAIL (다수 파일에 해당)

python manage.py migrate blog 100 # FAIL (해당되는 파일이 없음)

python manage.py migrate blog 0001 # OK

python manage.py migrate blog 0002 # FAIL (다수 파일에 해당)

python manage.py migrate blog 0002_c # OK

python manage.py migrate blog 0002_create # OK

python manage.py migrate blog 0002_update # OK

python manage.py migrate blog zero # blog앱의 모든 마이그레이션을 취소

 

-- 필수 입력 필드를 추가

  • 기존 모델 클래스에 필수 필드를 추가하여 makemigrations 수행

  • 필수 입력 필드를 추가하므로, 기존 Row들에 필드를 추가할 때, 어떤 값으로 채워 넣을 지 묻습니다.

선택1) 지금 값을 입력

선택2) 모델 클래스를 수정하여 디폴트 값을 제공

 


--blog App 작성 : ORM과 쿼리셋(QuerySets)

--QuerySet

1) QuerySet이란?

  • 쿼리셋(QuerySet)은 DB로부터 데이터를 인고, 필터링을 하거나, 정렬을 할 수 있습니다.

  • 쿼리셋을 사용하기 위해 먼저 python shell을 실행한다.

 

# 인터렉티브 콘솔(Interactive Console) 실행

Django_src> python manage.py shell

 

1) 모든 객체 조회하기

모든 객체를 조회하기 위해 all() 함수를 사용합니다.

>>>Post.objects.all()

>>>from blob.models import Post

>>>Post.objects.all()

 

2) 객체 생성하기

객체를 저장하기 위해 create() 함수를 사용합니다.

작성자(author)로서 User(사용자) 모델의 인스턴스를 가져와 전달 해줘야 합니다.

>>>from django.contrib.auth.models import User

>>>User.objects.all()

>>>me = User.objects.get(username='ola')

>>>Post.objects.create(author=me, title='Sample title', text='Text')

>>>Post.objects.all()

 

3-1) 필터링 하기

원하는 조건으로 데이터를 필터링 한다. filter() 괄호 안에 원하는 조건을 넣어 주면 됩니다.

# 특정 사용자가 작성한 글을 찾고자 할 때

>>>Posts.objects.filter(author=me)

# 글의 제목(title)에 'title' 이라는 글자가 들어간 글을 찾고자 할 때

>>>Post.objects.filter(title__contains='title')

# 게시일(published_date)로 과거에 작성한 글을 필터링하여 목록을 가져올 때

>>>from django.utils import timezone

>>>Post.objects.filter(published_date__lte=timezone.now())

**lte = less than equal

 

3-2) 필터링 하기

# 게시(publish)하려는 Post의 인스턴스를 가져온다.

>>>post = Post.objects.get(title="Sample title")

# 가져온 Post 인스턴스를 publish() 메서드를 이용하여 게시한다.

>>>post.publish()

# 게시일(published_date)로 과거에 작성한 글을 필터링하여 목록을 다시 가져온다.

>>>Post.objects.filter(published_date__lte=timezone.now())

 

4) 정렬 하기

# 작성일(created_date) 기준으로 오름차순으로 정렬하기

>>>Post.objects.order_by('created_date')

# 작성일(created_date) 기준으로 내림차순으로 정렬하기 : – 을 붙이면 내림차슨 정렬

>>>Post.objects.order_by('-created_date')

# 쿼리셋들을 함께 연결(chaining) 하기

>>>Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')

 

 

**get과 filter의 return type

mypost = Post.objects.filter(title__contains='title')
type(mypost)

>>>django.db.models.query.QuerySet

 

from django.shortcuts import get_object_or_404
post1 = get_object_or_404(Post,pk=1)
type(post1)
post1.created_date

>>>blog.models.Post

 datetime.datetime(2021, 1, 12, 6, 29, 30, tzinfo=<UTC>)

 

**게시글 지우기

delpost = Post.objects.get(id=3)
delpost.delete()

 

728x90

+ Recent posts