TIL - Django - 초기 세팅

김영훈·2021년 3월 29일
1

Django

목록 보기
2/11

Django에서 데이터베이스에 대한 CRUD 기능이 구현되가끼자의 절차(과정)에 대해 정리해보자.

# 가상환경 생성 및 Mysql과 Django 연결하기

  • 가상환경 생성 및 활성화

    • 가상환경 생성 : conda create -n project python=3.8
    • 가상환경 활성화 : conda activate project
    • 가상환경에 django 설치 : pip install django
    • 가상환경에 mysqlclient 설치: pip install mysqlclient
  • project & application 생성

    • 프로젝트 폴더 생성: (경로 이동 후) django-admin startproject 폴더 이름
    • app 생성: (프로젝트 폴더로 이동 후) python manage.py startapp app 이름
    • app 추가: 생성한 app 이름을 settings.pyINSTALLED_APS에 추가
  • Database 생성

    • mysql 실행: mysql -u root -p
    • 데이터베이스 생성: create database 데이터베이스 이름 character set utf8mb4 collate utf8mb4_general_ci;
    • 생성된 데이터베이스 확인: show databases;
    • 생성된 데이터베이스 삭제: drop database 삭제할 데이터베이스 이름;
    • 테이블 데이터 전체 삭제: delete from 테이블 이름;
    • 데이터베이스 백업(dump)하기: mysqldump -u [사용자아이디] -p 데이터베이스명 [테이블명] > 저장될 파일명
      • ex) mysqldump -u root -p herhouse_pr > herhouse_dump.sql
    • RDS에서 데이터베이스 백업(dump)하기: mysqldump --column-statistics=0 -h [RDS 엔드포인트] -u [사용자아이디] -p 데이터베이스명 [테이블명] > 저장될 파일명
      • ex) mysqldump --column-statistics=0 -h herhouse-database.cdsbia3f8w0i.us-east-2.rds.amazonaws.com -u root -p herhouse3 > herhouse_dump7.sql
      • DDL 정보(테이블 구조)만 백업(dump)하기: mysqldump -u [사용자아이디] -p 데이터베이스명 --no-data > 저장될 파일명
      • 테이블 구조를 제외한 데이터만 백업(dump)하기: mysqldump -u [사용자아이디] -p --no-create-info 데이터베이스명 > 저장될 파일명
    • RDS에 dump import하기 : mysql -h [RDS 엔드포인트] -u [사용자아이디] -p 데이터베이스명 < 덤프파일명.sql
  • settings.py 설정

    • IP 허용: ALLOWED_HOSTS = ['*'](모든 사용자의 접속 허용)

    • 주석 처리: admin, auth, CsrfViewMiddleware, AuthenticationMiddleware

    • urls.py에서 admin관련 내용 제거(import된 모듈, path)

    • corsheaders 설치

      • Django-cors-headers란?

        • django의 cors에 대한 원활한 처리를 도와주는 플러그인으로 설치가 필요하다.
      • cors란?

        CORS 란 웹브라우저에서 현재 사용자가 사용중인 사이트 이외에 동시에 다른 사이트에 접근하는 경우를 처리하기 위한 웹브라우저 표준기술이다. 웹브라우저 표준기술이기 때문에 브라우저가 이를 지원해야 한다.

      • cors가 나온 보안적 배경

      • 설치 과정

        • 패키지 설치: pip install django-cors-headers

        • APPS 추가: settings.py의 INSTALLD_APPS에 'corsheaders' 추가

        • middleware 추가: 'corsheaders.middleware.CorsMiddleware',

        • 허용할 값 정의:

          #REMOVE_APPEND_SLASH_WARNING
          APPEND_SLASH = False
          
          ##CORS
          CORS_ORIGIN_ALLOW_ALL=True
          CORS_ALLOW_CREDENTIALS = True
          
          CORS_ALLOW_METHODS = (
              'DELETE',
              'GET',
              'OPTIONS',
              'PATCH',
              'POST',
              'PUT',
          )
          
          CORS_ALLOW_HEADERS = (
              'accept',
              'accept-encoding',
              'authorization',
              'content-type',
              'dnt',
              'origin',
              'user-agent',
              'x-csrftoken',
              'x-requested-with',
                  #만약 허용해야할 추가적인 헤더키가 있다면?(사용자정의 키) 여기에 추가하면 됩니다.
          )
    • Mysql database와 django 연동

      • 개인정보가 git에 업로드되는 것을 막기 위해 manage.py가 위치한 최상위 경로에 my_settings.py생성

      • 생성된 곳에 아래의 내용을 붙여넣은 뒤, 사용할 'Name'과 'PASSWORD'를 설정(PASSWORD는 mysql의 비밀번호와 일치해야 한다!)

        DATABASES = {
            'default' : {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'exercise',
                'USER': 'root',
                'PASSWORD': 'pass1423',
                'HOST': 'localhost',
                'PORT': '3306',
            }
        }
        SECRET = {
                'secret':'=6xvu3t)6+8k8vi@b-(g4=2ah$@vi*^f@h#fraf)mc-_3@xw8t',
        }
      • Apple M1을 사용할 경우, 다음 작업이 추가적으로 요구된다.

        • pip install pymysql

        • pip install cryptography

        • my_settings.py 상단에 다음 내용을 입력

          • import pymysql

          • pymysql.install_as_MySQLdb()

      • settings.py에서 모듈 my_settings.py 불러오기

        • import my_settings

        • SECRET = my_settings.SECRET['secret']으로 설정

          • SECRET : 회원가입 시 비밀번호 암호화해준다.

          • debug = True : 서버 에러 찍어주는 것. —> 불필요한 정보가 노출되기 때문에 배포 시에는 False로 설정해야 한다.

        • DATABASES = my_settings.DATABASES

    • mysql 테이블 삭제 후 django의 makemigrations 명령이 반영되지 않을 경우...

      1. 해당 앱에 있는 migrations 폴더 삭제, 단 __init__.py 파일을 제외하고 삭제하기!

      2. 데이터베이스에 직접 접속하여 테이블 중 django_migrations 라는 테이블에서 해당 앱에 대한 raw를 삭제.

        • DELETE FROM django_migrations WHERE app = '앱 이름'
      3. python manage.py makemigrations // python3 manage.py migrate 수행 하면 해결!!

      4. 혹시 python manage.py migrate에서 오류가 발생하는 경우, python manage.py migrate --fake <앱이름> 실행하면 된다. 

  • .gitignore 설정

    • .gitignore 설정이 필요한 이유

      • 깃을 사용하여 올리는 소스들 중에는 올리고 싶지 않은것, 올려서는 안되는 것들이 존재한다. 이를 구분하기 위해 깃이 설치된 디렉토리에 .gitignore파일을 생성해서 관리해야 한다.
    • 설정 방법

      cd '프로젝트 폴더명' (manage.py가 존재하는 디렉터리)
      touch .gitignore
      vi .gitignore
      
      아래 두가지 추가
      my_settings.py (보안 관련 파일은 github에 업로드되면 안됩니다.)
      *.csv (crwaling한 파일 역시 업로드하지 않습니다.
      
      # github에 업로드하고 싶지 않은 폴더가 있다면... 다음 형식으로 추가
      파일이름/
      ex) .idea/
  • models.py에서 테이블 생성

    • class 1개 = 테이블 1개

    • class 이름은 단수 명사로 지정해야 한다.

    • models.DateTimeField(auto_now_add=True) : 해당 컬럼의 데이터 생성 시 현재 시간 자동 저장

    • models.DateTimeField(auto_now=True) : 해당 컬럼의 데이터 갱신 시 현재 시간 자동 저장

    • class Meta: 내부에서 변수 db_table의 값을 할당하여 데이터베이스 상의 테이블 이름을 지정할 수 있다.

    • python manage.py makemigrations

    • python manage.py migrate

    • 주의할 점

      • Pk(기본키) 특징: null값이 있으면 안되고 unique해야 함

      • 컬럼(field)을 새롭게 추가했을 경우, 추가한 컬럼에 대한 데이터를 모두 넣어줘야 한다. 만약 넣어주지 않으면 에러가 밸상한다. 에러를 방지하려면 데이터를 전부 넣거나, null=True로 설정해야 한다.

  • 사용중인 포트 찾아서, Kill 하기

    • lsof -i :포트번호: 해당 포트번호를 사용중인 서비스가 있는지 확인하기
    • sudo lsof -t -i tcp:8000 | xargs kill -9 PID번호: 해당 PID 번호를 사용 중인 서비스가 있는 경우, 서비스를 종료한다.
    • sudo lsof -t -i tcp:8000 | xargs kill -9: 해당 포트 번호를 사용 중인 서비스가 있는 경우, 서비스를 종료한다.

# CRUD 기능 활용하기

  • CRUD 기능을 구현한다는 것은 무슨 의미일까?

    • model과 데이터베이스의 상호작용(데이터의 생성, 읽기, 수정, 삭제)이 이뤄지도록 하는 것을 의미
  • Python manage.py shell : Django import되어 있기 때문에 원하는 내가 원하는 모듈, 클래스, 함수 등을 import할 수 있다.

    • ex) Product model import하기 —> from product.models import Product

    • 메소드 리스트 확인 방법: class name. 입력 후 tab키 누름

    • get, create, update, delete에 관한 메소드 리스트 확인 방법: class name.objects. 입력 후 tab키 누름

  • 대표적인 CRUD 메소드

    • class이름.objects.all(): 전체 데이터를 쿼리셋 형태가져옴

    • class이름.objects.create(name=’사과’): 데이터 생성

    • a = class이름(필드명=''): 데이터 생성(클래스 인스턴스 객체 생성 방법) ▶ a.save()로 저장해야 한다.

    • class이름.objects.get(필드명=''): 데이터를 오직 한 개만 불러오기 때문에 괄호 안에 조건 입력이 필수

    • class이름.objects.filter(필드명=''): 조건에 해당하는 데이터를 쿼리셋 형태로 불러옴

    • class이름.objects.values(): 데이터 내용이 list 안의 dict 형식으로 출력

    • a = Product.objects.get(id=1) 로 할당 ▶ a.name —> 특정 필드 데이터에 접근

    • b = Product.filter(id=1)로 할당 ▶ 쿼리셋은 list형식 데이터므로, 인덱싱으로 접근 ▶ b[0].name —> 특정 필드 데이터접근

    • a = Product.objects.get(id=1) 로 할당 ▶ a.name = ‘귤’a.save() —> 데이터가 수정

    • class이름.objects.get(필드명='').delete() : 데이터 삭제(쿼리셋 객체와 일반 객체 모두적용된다.)

    • class이름.objects.filter().update(필드명='') —> update()쿼리셋 객체에 대해서만 적용 가능하다

  • Mysql에서 테이블 확인하기

    • mysql -u root -p

    • use 데이터베이스 이름

    • 현재 DB의 테이블 목록 출력: show tables;

    • 테이블 구조 확인: desc 테이블 이름;

    • 테이블에서 데이터 출력: select * from 테이블 이름;

profile
Difference & Repetition

0개의 댓글