도커란 ? 

도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다. 도커 웹 페이지의 기능을 인용하면 다음과 같다: 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 

 

쉽게 말하자면 내 컴퓨터에서 작업한 결과가 다른 컴퓨터에서도 똑같이 동작한다는 보장이 없다. 컴퓨터 환경이 전부 다르기 때문이다. 도커의 역할은 다른 하드웨어와 운영체제에서 작업하더라도 동일한 환경을 갖출 수 있도록 도와주는 기술이다. 가상환경(env)와 비슷한데 가상환경은 개발 환경을 구축하기에는 충분하지만 구현한 서비스를 서버에 옮겨서 서비스를 제공하는 배포 과정에는 부족하다. 배포를 하기 위해서는 소스 코드를 복제해서 적절한 위치에 저장하고, 웹 페이지를 보여주는 웹 서버, 웹 서버에서 받은 요청을 프레임 워크(Django, Wagtail 등등)에게 넘겨주기 위한 인터페이스, 데이터베이스 등의 추가적인 작업이 필요하다. 가상환경으로는 한계가 있어서 도커를 사용해 모든 환경을 서버로 옮기는 것이다. 

 

 

도커의 작동 방식

1) 도커 설정 파일에 웹 사이트 배포에 필요한 환경설정 정보를 모두 지정한다. 2) 도커를 실행하면 설정 파일에 지정한 대로 서버 전체를 복제한 컨테이너 이미지가 생성된다. 3) 마지막으로 생성된 컨테이너 이미지를 실행시키면 된다. 

 

 

1. Docker 설치 

 

 

Ubuntu 기준으로 설치하는 방법을 간략하게 소개

 

 

1) 오래된 버전 삭제하기

sudo apt-get remove docker docker-engine docker.io containerd runc

 

2) repository 설정하기

$ sudo apt-get update
 
$ sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

 

3) Docker Official GPG Key 등록

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

4) stable repository 등록

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

5) Docker Engine 설치

$ sudo apt-get update
 
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

 

6) 버전 확인

docker --version

 

7) Docker Compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose -version

Docker Compose의 최신 버전은 아래 링크에서 확인할 수 있다. 

 

https://github.com/docker/compose/releases

 

 

2. Docker File

 

 

Dockerfile에는 지금까지 프로젝트를 진행한 로컬 환경과 동일한 Container 이미지를 만들기 위해 지정할 내용을 작성한다. 

Wagtail에서 기본으로 제공하는 Dockerfile을 살펴보자. (Dockerfile이 기본명)

# 도커는 파이썬이 설치되어 있는 이미지를 기본으로 제공한다. 이 이미지를 불러온다. 
FROM python:3.8.1-slim-buster

# Container Port 설정 (참고 <1>)
EXPOSE 8000

# 파이썬은 종종 소스 코드를 컴파일해서 확장자가 .pyc인 파일을 생성하는데 
# Docker에서는 필요하지 않으므로 생성하지 않도록 방지
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \ # 파이썬 로그가 버퍼링 없이 즉각적으로 출력하게 만듦
    PORT=8000

# requirements.txt에서 필요한 라이브러리를 설치하기 위해 필요한 gcc, musl-dev 등을 미리 설치
RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-recommends \
    build-essential \
    libpq-dev \
    libmariadbclient-dev \
    libjpeg62-turbo-dev \
    zlib1g-dev \
    libwebp-dev \
 && rm -rf /var/lib/apt/lists/*

# 서버 배포를 위한 gunicorn 설치
RUN pip install "gunicorn==20.0.4"

# requirements.txt 설치
COPY requirements.txt /
RUN pip install -r /requirements.txt

# 로컬 컴퓨터의 현재 위치에 있는 파일을 모두 작업 폴더로 복사.
# /usr/src/app는 복사할 작업 폴더를 의미.
WORKDIR /usr/src/app

COPY . /usr/src/app

# static file 관리
RUN python manage.py collectstatic --noinput --clear

RUN find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

# 추가 
# 엔트리 포인트 설정, Docker 버전 문제로 권한 문제가 발생하므로 'sh'를 붙인다.
# 권한 문제는 아래로도 해결할 수 있다. 
# docker-compose -f docker-compose.yml build --no-cache
ENTRYPOINT ["sh", "/home/app/web/entrypoint.prod.sh"]

<1> expose와 ports 모두 컨테이너 포트를 노출 시키는 것이지만 expose는 호스트 내부의 다른 컨테이너들만 액세스가 가능하고 ports로 노출하면 ports에 설정한 호스트 포트번호로 호스트 외부의 다른 호스트들도 호스트 포트번호로 액세스가 가능.

 

 

참고) Dockerfile의 명령어에 대해서 정리해놓은 블로그이다. 

https://www.daleseo.com/dockerfile/

 

 

3. Docker Compose File

 

 

Docker Compose file을 사용하면 Container를 여러 개를 한 번에 실행시킬 수 있고, Container를 실행시킬 때 옵션도 줄 수 있다. (docker-compose.yml이 기본명)

# 도커 컴포즈 파일 포맷 버전  
version: '3'

services:
  # service에 nginx라는 이름의 컨테이너를 추가
  nginx:
  	# nginx 컨테이너를 만들기 위한 파일을 넣을 nginx 폴더를 생성
    build: ./nginx    
    # 컨테이너가 종료되면 컨테이너 안에 저장되어 있는 내용도 사라지는데 
  	# Nginx의 Volume 기능을 이용하면 컨테이너를 다시 실행했을 때 바로 불러올 수 있다.
  	# 웹 사이트 방문자가 정적 파일을 요청하면 vloume에 저장되어 있는 파일을 바로 보내줌.
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_media
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    ports:
    	# 도메인이나 ip 주소 뒤에 아무것도 쓰지 않으면 80이 기본값.
      - 80:80
      - 443:443
    # nginx는 web container에 의존성을 갖음
    depends_on:
      - web
  certbot:
    image: certbot/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
      
  # web이라는 이름의 서비스 실행
  web:
  	# 현재 폴더를 build
    build: .
    # 터미널에서 실행했던 명령어를 대신 실행(귀니콘으로 실행)
    command: gunicorn do_it_django_prj.wsgi:application --bind 0.0.0.0:8000
    # volumes으로 로컬 컴퓨터의 폴더와 도커의 폴더를 연결. (현재 폴더를 /usr/src/app/ 폴더와 연결)
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_media
      - ./:/usr/src/app/
    # 포트 설정
    ports:
      - 8000
    # 배포 환경 설정
    env_file:
      - ./.env.prod
    # web 컨테이너는 db 컨테이너가 실행된 이후에 시작해야 함.
    depends_on:
      - db
  
  db:
  	# docker에서 제공하는 postgres db 버전 설정
    image: postgres:12.0-alpine
    # 컨테이너 실행이 중단되더라도 데이터베이스의 내용 유지
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    # 데이터 베이스의 사용자명, 암호, 데이터베이스 명을 저장한 env파일 연결
    env_file:
      - ./.env.prod.db
volumes:
  postgres_data:
  # 위에서 언급한 volume nginx volume을 위해 추가
  static_volume:
  media_volume:

source code file 출처 : https://github.com/saintdragon2/do_it_django_a_to_z/blob/master/docker-compose.yml

 

 

nginx/Dockerfile

# 도커가 제공하는 nginx 사용하기
FROM nginx:latest
# 이 이미지 안의 default.conf에는 도커가 제공하는 Nginx의 기본 설정값이 있다. 
# rm을 통해서 삭제.
RUN rm /etc/nginx/conf.d/default.conf
# 삭제한 default.conf 대신 새로 생성한 설정 정보를 사용
COPY nginx.conf /etc/nginx/conf.d

nginx를 docker에서 사용하기 위한 설정이다. 

 

 

docker compose 명령어

docker-compose build
docker-compose --build # 이미지 실행시키면서 빌드
docker-compose up
docker-compose -f docker-compose.dev.yml up # 특정 docker compose file 실행
docker-compose up -d # 백그라운드에서 실행

docker-compose down # 실행중인 컨테이너 종료

docker-compose down -v # 컨테이너를 내리고 연결되어 있는 볼륨도 전부 삭제

 

 

Docker 확인

docker image ls # 도커 이미지 확인
docker container ls # 도커 컨테이너 확인

docker-compose logs # 로그 확인

 

 

Docker에서 명령어 실행

# docker-compose 명령을 이용해 현재 실행 중인 web 컨테이너에 접속해서 실행
docker-compose exec web python manage.py createsuperuser
docker-compose exec web python manage.py migrate

 

'Back-End > Wagtail, Django 배포' 카테고리의 다른 글

DumpData  (0) 2022.01.08
Wagtail RichText API  (0) 2022.01.07
2. Gunicorn, Nginx 적용  (0) 2021.12.23
1. PostgreSQL 적용  (0) 2021.12.22
4. AWS (인스턴스 생성, 서버 접속)  (0) 2021.12.20

1. AWS 가입

 

 

https://aws.amazon.com/ko/?nc2=h_lg 

 

클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services

AWS IoT에 대한 새로운 소식 산업, 소비자, 상업 및 자동차 워크로드에 대한 IoT 데이터를 수집, 저장 및 분석하는 새로운 방식에 대해 알아보세요. 발표 내용 살펴보기 

aws.amazon.com

먼저 aws 가입을 진행한다. 

 

 

AWS란? 

아마존 웹 서비스는 다른 웹 사이트나 클라이언트측 응용 프로그램에 대해 온라인 서비스를 제공하고 있다.

쉽게 말하자면 웹 사이트 운영을 위해 서버를 대여하는 것이다. 서버는 24시간 켜져 있어야 하고 무거운 트래픽을 감당할 수 있어야 한다. 직접 서버 컴퓨터를 구매하여 운영하기에는 비용면에서 비효율적이므로 개인이나 소규모 웹 사이트는 서버 대여를 하는 것이 여러모로 좋다. 

 

 

2. 콘솔에 로그인

 

 

일단 지역을 서울로 바꿔주자. 지역을 바꾸는 이유는 선택한 지역의 서버 컴퓨터를 임대한다는 의미이다. 

 

 

그 다음에는 관리자 콘솔로 이동한다. ec2를 검색하여 들어가자. 

 

 

2. 인스턴스 생성

 

 

인스턴스로 이동하자. 작성자는 이전에 만든 인스턴스가 있지만 처음 aws를 사용하는 사람은 아무것도 없는 것이 정상이다. 오른쪽 상단에 있는 인스턴스 시작을 누르자. 

 

 

서버 컴퓨터 os를 선택하는 화면이다. Ubuntu로 선택하여 구축하도록 하겠다. 

 

 

정식 서비스면 서비스에 맞게 서버를 임대해야 하지만 공부용이나 테스트용은 프리티어로 선택하면 된다. 

왼쪽 하단의 다음: 인스턴스 세부 정보 구성을 눌러주자

 

 

인스턴스를 구축하기 위해 VPC 구성이 필요하다. VPC(Virtual Private Cloud)는 가상의 네트워크에서 Cloud의 리소스 즉 AWS의 리소스를 사용할 수 있게 해준다. 

구현에 중점을 맞췄기 때문에 VPC 만들기 또는 새 기본 VPC 생성에서 새 기본 VPC 생성을 눌러주자. 자동으로 VPC를 생성해준다. 

 

 

자동으로 VPC를 생성해주었다. 

 

 

다시 인스턴스 생성으로 돌아가서 나머지는 전부 기본으로 설정하고 넘기고 보안 그룹 구성에서 소스만 내 IP로 바꿔준다. 이제 검토 및 시작을 누르게 되면 다음 화면이 나타난다. 

 

 

키 페어 이름에는 적고 싶은 이름을 적으면 된다. 키 페어는 쉽게 말해서 우리가 만든 인스턴스로 접속할 수 있는 열쇠라고 생각하면 된다. 키 페어를 다운로드 하고 인스턴스 시작을 눌러주자. 

 

* 키 페어는 중요하므로 잘 보관해놓자.

 

 

인스턴스가 생성되었다. 인스턴스는 종료를 하게 되면 시간이 지나면 삭제가 된다. 인스턴스를 사용하지 않을 때면 중지를 해놓자. 

 

 

3. 탄력적 IP 주소 할당

 

 

왼쪽 메뉴의 탄력적 IP를 선택해주자. 인스턴스(서버)는 중지하고 실행하게 되면 IP주소가 바뀌어버린다. 이를 방지하기 위해 고정 IP를 설정해주는 기능이라고 생각하면 된다. 탄력적 IP 주소 할당을 누르고 할당해주자. 

 

 

생성되었으면 탄력적 IP 주소 연결을 선택해주자. (주소 릴리즈는 삭제이다.)

 

 

인스턴스와 프라이빗 IP주소에 우리가 생성한 인스턴스가 있을 것이다. 선택해주고 연결을 눌러주자. 

 

이제 AWS 인스턴스 서버가 완성되었다. 세부 설정은 AWS에 익숙해지고 설정하는 것을 추천한다. 

그리고 계속 인스턴스를 유지하게 되면 요금이 부과된다. 공부용이나 테스트용은 꼭 반대 순서를 통해 인스턴스를 삭제해주자!!

 

 

4. 인스턴스 접속

 

 

다시 인스턴스 메뉴로 돌아와서 생성된 인스턴스를 클릭하고 연결 버튼을 클릭하자. (우측상단에 버튼 목록에 2번째에 있다.)

 

 

그러면 다음과 같은 화면을 확인할 수 있다. 

 

여기서 우리에게 필요한 명령어는 다음과 같다. 

ssh -i "somthing.pem" ubuntu@ec2-3-37-3-24.ap-northeast-2.compute.amazonaws.com

 

ssh -i [full path to keypair file] ec2-user@[EC2 instance hostname or IP address]

Mac

 

 

ssh를 사용해서 우리가 생성해놓았던 비밀 키를 가지고 서버에 접속한다는 것이다. 참고로 작성자의 운영체제는 우분투이다. 우분투 사용자는 터미널을 열어서 위 명령어를 입력해주면 된다. 

 

* "somthing.pem"은 비밀키의 경로를 적어주어야 한다. 작성자는 비밀 키가 있는 폴더에서 명령어를 실행해주었다. 

 

 

그리고 비밀키의 권한을 설정해주어야 한다. (다시한번 언급하지만 키가 있는 경로로 입력해주던가 아니면 작성자 처럼 키가 있는 폴더로 이동해서 입력해주면 된다.)

chmod 400 something.pem

 

 

 

윈도우 사용자는 putty를 사용하면 편한데 사용방법은 

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/putty.html

 

PuTTY를 사용하여 Windows에서 Linux 인스턴스에 연결 - Amazon Elastic Compute Cloud

프라이빗 키의 암호는 추가 보호 계층입니다. 프라이빗 키가 노출되더라도 암호 없이 사용할 수 없습니다. 암호문 사용의 단점은 인스턴스에 로그온하거나 인스턴스에 파일을 복사하기 위해 사

docs.aws.amazon.com

아마존 공식문서를 참고해보자.

 

 

추가) 

 

 

혹시 ssh가 설치가 안된 사용자들은 다음 명령어를 터미널에서 실행시키면 된다. 

sudo apt update
sudo apt install openssh-server
sudo apt-get install openssh-client

 

 

sudo systemctl status ssh

위 명령어로 ssh의 상태를 알 수 있다. 

 

 

sudo systemctl enable ssh
sudo systemctl start ssh

만약 실행중이 아니라면 위 명령어를 실행해주자. 

 

 

sudo ufw allow ssh

방화벽을 사용하는 사용자들은 방화벽에 ssh를 허용해주자. 

 

 

ssh -i "somthing.pem" ubuntu@ec2-3-37-3-24.ap-northeast-2.compute.amazonaws.com

모든 준비가 되었으면 ssh로 접속하면 된다. 

 

 

성공적으로 서버에 접속했다. 

'Back-End > Wagtail, Django 배포' 카테고리의 다른 글

DumpData  (0) 2022.01.08
Wagtail RichText API  (0) 2022.01.07
2. Gunicorn, Nginx 적용  (0) 2021.12.23
1. PostgreSQL 적용  (0) 2021.12.22
3. Docker(Django, Wagtail)  (0) 2021.12.22

https://www.phooky.com/blog/deploy-your-wagtail-webpage-with-docker-postgresql-gunicorn-nginx/

 

 

conda install -c anaconda psycopg2
sudo chmod666 /var/run/docker.sock
sudo -i -u postgres
chmod 755 entrypoint.sh
docker-compose -f docker-compose.prod.yml build --no-cache

 

'Back-End > Wagtail, Django' 카테고리의 다른 글

Wagtail, Django ModelAdmin Search  (0) 2022.01.14
Wagtail Changing the Admin Display Title  (0) 2021.12.03
Wagtail Routable  (0) 2021.12.03
Wagtail StreamField Options  (0) 2021.12.02
Wagtail Custom Page Properties  (0) 2021.12.02

1. request.GET

 

request.GET은 http request의 정보를 dictionary 데이터로 받는 기능이다.

 

topic = request.GET.get("topic",None)

위의 코드를 살펴보면 request에 담겨있는 "topic"이라는 내용을 가져오는 것이다. 뒤에 None은 "topic"이라는 정보가 없으면 None을 가져온다는 의미이다. (오류 방지)

 

 

2. request.META

 

request.META는 사용자의 IP 주소와 사용자 Agent(일반적으로 웹 브라우저의 이름과 버전)를 포함해 지정된 요청에 대해 사용할 수 있는 모든 HTTP 헤더가 들어있는 파이썬 딕셔너리다.

 

  • request.META는 기본 파이썬 딕셔너리이므로 존재하지 않는 키에 접근하면 KeyError 예외 발생.
  • 헤더는 외부 데이터이므로 신뢰할 수 없고, 특정 헤더가 비어있거나 존재하지 않으면 정상적으로 동작하지 않도록 해야한다.
  • 정의되지 않는 키의 대소 문자를 처리하려면 try/except 나 get() 메소드 사용

 

1) 안좋은 예시

def ua_display_bad(request):
    ua = request.META['HTTP_USER_AGENT']  # Might raise KeyError!
    return HttpResponse("Your browser is %s" % ua)

 

2) 좋은 예시

def ua_display_good1(request):
    try:
        ua = request.META['HTTP_USER_AGENT']
    except KeyError:
        ua = 'unknown'
    return HttpResponse("Your browser is %s" % ua)

 

3) 좋은 예시

def ua_display_good2(request):
    ua = request.META.get('HTTP_USER_AGENT', 'unknown')
    return HttpResponse("Your browser is %s" % ua)

 

출처 : https://yonghyunlee.gitlab.io/python/django-master-6/

 

 

3. requests

django에서 POST나 GET을 사용하는 requests라는 모듈이 있다. 

 

https://docs.python-requests.org/en/master/user/quickstart/

 

'Back-End > Django' 카테고리의 다른 글

Wagtail Django_extensions, ipython  (0) 2021.11.19
Django Signals  (0) 2021.10.22
Django ORM  (0) 2021.10.21
Django iamport 적용하기  (0) 2021.10.06
Django Bulma 적용 방법  (0) 2021.08.24

 

https://django-ninja.rest-framework.com/tutorial/authentication/

 

Authentication - Django Ninja

Authentication Intro Django Ninja provides several tools to help you deal with authentication and authorization easily, rapidly, in a standard way, and without having to study and learn all the security specifications. The core concept is that when you des

django-ninja.rest-framework.com

 

 

Django Ninja에서 제공하는 Authentication 기능이다. 다양한 방식의 Authentication을 제공하는데 JWT(JASON Web Token)으로 하는 방법에 대해서 간단 정리하려고 한다.

 

일단 OAuth에 대해서 잠깐 집고 넘어가자. 

 

 

OAuth 2.0(Open Authorization 2.0, OAuth2)은 인증을 위한 개방형 표준 프로토콜입니다.

이 프로토콜에서는 Third-Party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공합니다.

OAuth에 대해선 위 블로그에 자세하게 나와있다. 내용을 전부 알고 있으면 좋겠지만 이번 포스팅의 주제에 벗어나므로 간단하게 흐름도만 파악하고 넘어가려고 한다. 

 

Google의 로그인 기능을 사용하기 위해서는 Client가 Google에 Access Token을 요청하고 전달 받는다. 물론 Token을 요청하고 받기 위해서는 미리 설정을 해줘야한다. Google의 개발자 콘솔이 그것이다. 

과거에는 AJax를 이용하여 비동기 통신을 했지만 최근에는 SPA인 Vue나 React를 이용하여 Frontend와 Backend를 분리해서 구축한다. 로그인 요청은 Frontend에서 하기 때문에 개발자 콘솔에서 URL 설정은 Frontend의 URL주소로 설정해줘야한다. 

 

원본은 Frontend URL, 리디렉션에는 Login 기능이 있는 URL를 적어주면 된다. 

 

Frontend와 Backend에서 정보를 주고 받을 때 사용하는 것이 JWT이다. Bearer 보안으로 이루어져있는데 Django Ninja에서는 이 토큰을 받고 Authentication을 처리해주는 기능을 제공한다. 

 

 

from ninja.security import HttpBearer


class AuthBearer(HttpBearer):
    def authenticate(self, request, token):
        if token == "supersecret":
            return token


@api.get("/bearer", auth=AuthBearer())
def bearer(request):
    return {"token": request.auth}

API auth에 Authentication 방식을 설정해놓으면 API를 실행하기 전에 관련 Authentication Class를 통과한 다음 실행한다. authenticate의 token이 API요청 클라이언트에 포함되어 있는 Bearer token을 파싱해서 가져온다. 

token에는 유저의 정보가 들어있다. 

 

import jwt

from rest_framework_simplejwt import settings


payload = jwt.decode(jwt=token, key=settings.DEFAULTS['SIGNING_KEY'], algorithms=settings.DEFAULTS['ALGORITHM'])
user_id = payload['user_id']

 

Google Social Login을 위해 이미 만들어져 있는 라이브러리를 사용하기 위해 로그인 기능만 REST FRAMEWORK를 사용했다. Django Setting에 들어가보면 secret key가 있는데 암호화를 사용할 때 사용하는 중요한 정보이다. Wagtail에서는 dev.py에 있다. key는 Django Secret key를 사용하면 되고 알고리즘은 "HS256"을 사용하는데 설정 값을 가져와서 넣는 것이 안전하다. 

'Back-End' 카테고리의 다른 글

Django Migrations오류  (0) 2021.12.15

항상 migrations폴더의 내용과 db.sqlite3를 날리고 했다. 하지만 불편하게 이만저만이 아니였다. db관련 오류가 발생하면 오류와 해결방법을 적으려고 한다. 

 

 

1. wagtail video 오류 

-> media 폴더의 original_video폴더를 지우면 된다. 아마 의존성 오류가 발생인데 video관련 테이블이 생성되기도 전에 video가 있어서 생기는 오류이다. 

 

2. table 생성관련 오류

-> 기존 모델을 지우고 새로운 모델을 생성할 때, 단순히 모델의 이름을 바꾸는 것이 아니라 새로운 필드와 관계형 모델을 설정할 때, migrations적용할 때, 이름만 바꾸겠냐고 물어보면 no를 해야한다. 

그리고 혹여나 오류가 발생했을 때에는 오류의 내용을 잘 읽어보고 해결하면 된다. 대부분 관련 모델의 테이블을 직접 db에서 삭제를 해주면 된다. 그리고 모든 app의 migrations 폴더의 __init__.py만 남겨두고 삭제한다. 

 

이후에 migrations와 migrate만 실행하면 문제가 없을 것이다. 

 

python manage.py dbshell -> db shell 접속
python manage.py migrate user -> user app만 migrate 진행

'Back-End' 카테고리의 다른 글

Django Ninja Authentication(Bearer)  (0) 2021.12.16

+ Recent posts