2022-02-14

"Django"

복습을 진행해보자

web client(browser)에서 ----> request를 보낸다 치자

request 방식(4가지)

  • 2가지 방식만 알아 보도록 하자
  • GET 방식
  • POST 방식

✍ GET 방식

  • GET으로 request를 보내면 데이터가 query string 형태로 request에 붙어서 나간다.
  • 즉 GET 방식은 전달하는 데이터가 query string(?변수=값)형식이다.

✍ POST 방식

  • POST 방식은 request를 보낼때 request 헤더 내에 내가 전달한 데이터를 포함시켜서 보낸다.
  • POST 방식은 딱 하나만 정해져 있다.

아무튼 이 과정에서 request를 보내면 이 request를 분석하는 놈이 받는데 그녀석이 바로 [ URLConf ]이다.(python module로 존재한다)


URLConf ------> View

  • URLConf가 web client의 request를 처리할 수 있는 함수를 view로부터 호출한다.
  • view(python module)는 함수의 집합이다.
  • 여기서 만약 db를 처리해야한다 하면

View -----> model

  • model(class의 집합) [ python module]
  • python module은 파일임
  • model은 db와 연동을 하게 된다.
  • model은 db를 ORM을 통해 연동을 하게 된다.
  • 이 ORM 연동은 장고가 알아서 해준다!
  • 어쨌든 View가 데이터베이스를 이용하려면 model을 이용해야 한다.

결과를 얻으면 View가 결과를 리턴해줘야하는데 이때 view가 기존에 만들어 놓은 html을 이용한다.

  • 그게바로 template이다.

이 template이 바로 우리가 알고있는 html이다. ( 형태만 잡혀있는 html )

  • 즉 view에서 나오는 결과데이터 + template에 있는 html을 합쳐서 view가 client에게 response 해준다!

이 과정을 Django의 MVT pattern이라 한다!




예제

Django를 사용해보도록 하자!

  • 다음과 같이 테이블을 구성할 것이다.


  • 저번과 실행과정은 똑같다
  1. anaconda를 실행후 가상환경을 설정해 준다
  2. python manage.py startapp polls로 파일하나를 만들어준다.
    • polls 폴더가 생성 즉 우리가 만들 어플리케이션은 파일로 생성이 되는것을 알 수 있음
  3. setting 파일로가서 파일 setting을 진행
ALLOWED_HOSTS = ['127.0.0.1','localhost']
# allowed_host를 로컬 호스트로 설정해 준다.
  • installed apps에 polls라는 어플리케이션을 추가해줘야함
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls.apps.PollsConfig' 
    # 이렇게 polls파일 안에 생성된 apps.py이 파일안에 클래스 명으로 지정된 PollsConfig를 가져와준다.   
]
  • database를 mysql로 설정해줘야함
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }
# 초기에는 sqlite3로 설정되어있다. mysql을 사용하기위해 
# mysql 데이터베이스명, 사용자이름, 비밀번호와 호스트ip 그리고 포트번호를 기재해준다
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite_0214db',
        'USER': 'root',
        'PASSWORD': 'test123',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}
  • time_zone을 우리나라 시간으로 설정해준다.
TIME_ZONE = 'Asia/Seoul'
  • 여기까지 완료했으면 명세서를 통해 특정 이름의 테이블을 만들어준다
  • migrate명령어를 이용하면 명세서를 기반으로 실제 데이터를 처리해라 라는 의미를 가진다.
  • 가상환경에 mysqlclient를 설치해 줘야한다.
C:\python-django\MyFirstWeb_0214>pip install mysqlclient
  • migrate를 사용해 데이터 처리
C:\python-django\MyFirstWeb_0214>python manage.py migrate
  • admin 페이지를 설정해준다
C:\python-django\MyFirstWeb_0214>python manage.py createsuperuser
username :
mail :
password :
이렇게 3개를 입력하게 된다 그러면 superuser가 생성이된다.
  • runserver로 프로젝트를 deploy시킨다.
C:\python-django\MyFirstWeb_0214>python manage.py runserver
  • 해당 명령어를 실행후 나오는 링크를 클릭하면 다음과 같은 창이 뜨게된다
  • 여기까지가 기본적인 페이지를 띄우는 과정이다
  • 여기에 위에 예제 그림처럼 테이블을 작성해 넣어보도록 하자
  • 어플리 케이션 마다 즉 기능마다 view, tamplate, model이 다 따로따로 존재한다.

  • 모델을 먼저 만들어서 데이터 베이스의 테이블을 만들도록 하자

    • sql 구문을 이용하지 않고 python에서 배운 class를 통해 만들겠다는 얘기이다.
  • 질문 테이블 (question table)
    • id | integer(pk)
    • question_text | varchar(200) => 질문내용
    • pub-date | datetime => 질문생성시간

  • choice table
    • id | integer(pk)
    • choice_texet | varchar(200)
    • votes | integer => 현재까지 득표수
    • question | integer(fk)

  • choice table의 question이 question table의 id를 가리키게됨

이제 테이블을 만들어보자 polls가 니으 어플리케이션 폴더이다. 이 폴더안에 models.py폴더를 수정해주자.

from django.db import models
# 장고가 제공해주는 특별 모듈이다.

# model class를 만들때는 반드시 models.Model을 상속해야함!
# 모델 class를 만들면 자동으로 PK가 하나 설정됨
# model 클래스는 id란 colum으로 Integer타입으로 AUTO_INCREMENT형태로 생성되요!
class Question(models.Model):
    # 컬럼을 여기에다가 작성해줌
    # id = models.IntegerField() # 그렇기때문에 model 클래스를 만들면 이걸 안써줘도 된다!
    question_text = models.CharField(max_length=200) # 이게 question_text varchar(200)이런 의미이다.
    pub_date = models.DateTimeField()

    def __str__(self):
        return self.question_text
        # 객체명이 아닌 해당 
        #객체가 가지고 있는 질문 항목을 출력하기 위해 사용한다.

class Choice(models.Model):
    choice_text = models.CharField(max_length=50)
    vote = models.IntegerField(default=0) # default = 0은 초기에 값을 안넣어주면 0이 들어간다는 의미
    question = models.ForeignKey(Question,                 # Question 클래스에 명시되어 있지 않지만 Question 클래스의 id를 가리킴
                             on_delete=models.CASCADE) # pk가 지워지면 fk도 지워라 라는 의미
    def __str__(self):
        return self.choice_text

# 실제 MySQL Database에 Table을 만들기 위해서는
# python manage.py migrate ( 명세서를 기준으로 실제 Table 생성)
# model class를 기반으로 명세서를 만들어야 함
# python manage.py makemigrations ( 클래스를 기반으로 명세서를 만듬)
# 잘못 만든것 같아서 새로 수정하려하면 클래스 내용을 수정 후 만들어진 명세서를 지우면된다!
# 그러고 다시 makemigrations를 통해 새로 만들고 migrate를 통해 해당 데이터베이스를 다시 전송해주면된다.
  • 다음과 같이 모델을 수정해주면 명세서를 만들어서 테이블로 등록을 해주면된다.
  • 터미널에 다음과 같은 명령어를 입력하도록 하자
python manage.py makemigrations
python manage.py migrate
  • 해당 명령어를 사용하면 polls폴더 밑에 migrations폴더가 생성되어 명세서를 만든걸 확인할 수 있고 MySQL에 연동된 데이터베이스 폴더의 테이블을 보면 polls_question, polls_choice테이블이 추가된것을 확인 할 수 있다.
  • 이제 admin page에 들어와서 database 핸들링이 가능하다
  • 하지만 admin page에 들어가면 만든 테이블이 없다 어떻게 해줘야하는가?
  • 다시 파이참으로 돌아와 polls 폴더 안에 admin.py에 모델을 등록해줘야한다
  • admin.py 레지스터 등록
from django.contrib import admin
from polls.models import Question, Choice
# Question과 Choice 테이블을 사용하기 위해 import시켜 경로를 가져와준다.
# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
  • 다음과 같이 입력 후 다시 관리자 페이지에 들어가보면 다음과 같이 나온다!
  • 이제 Questions와 choices에 항목을 추가해보도록하자

  • 전체적인 프로그램의 도식도를 파악해보자

  • 기본적인 root url에서 추가적으로 경로를 탐색해서 include를 통해 해당 url(/polls/가 포함된 url을 의미)로 넘겨주면 그 url(/polls/)에서 view에게 request를 요청하여 view에서 해당 로직(index())을 실행 후 Database를 처리하여 Template를 이용해 해당 client에 response해준다. 이과정을 코드로 알아보도록하자.

좋은 웹페이지 즐겨찾기