Cloudtype에 Django drf RESTfull API 배포하기

레일리·2022년 8월 11일
3
post-thumbnail

🦁 멋쟁이사자처럼 대학 10기 활동 중에 작성된 글입니다.

배포 준비

장고 버전이 3.2 미만이라면 3.2 이상으로 업그레이드 해주기

→ 기존 장고 버전이 3.2 이상이라면 패스~

→ 아래 설치할 패키지 중 하나가 django 3.2 버전 이상 부터 적용 가능. 뭐였는지는 기억이 안난다..

💡 pip install --upgrade django==3.2

배포를 하기 위해 필요한 패키지 설치

💡 pip install django-cors-headers gunicorn whitenoise django-environ
  • gunicorn : 프로젝트가 서버 상에서 계속 구동되도록 도와주는 서버 엔진 관련 패키지
  • whitenoise : 정적 파일들의 사용을 도와주는 미들웨어 패키지
  • django-environ : Django 프로젝트에서 환경변수를 설정하고 사용하기 위한 패키지
  • django-cors-headers : CORS 에러 방지

외부 패키지 목록 만들기

💡 pip freeze > requirements.txt

→ 생성된 파일 깃허브에 올리면 됨.

settings.py 수정

기타 설정

DEBUG = False

ALLOWED_HOSTS = ['*']

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

앱 추가

INSTALLED_APPS = [
		...
    'corsheaders',
]

미들웨어 추가

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', ## 이거 추가!! 위치 중요!!!
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', ## 이거 추가!!
]

환경 변수 분리

환경 변수 분리를 다른 방법으로 사용 중이었어도 아래 get_env_variable 함수를 이용해 주세요.

def get_env_variable(var_name):
  try:
    return os.environ[var_name]
  except KeyError:
    error_msg = 'Set the {} environment variable'.format(var_name)
    raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_env_variable('DJANGO_SECRET')
.
.
.
# 데이터베이스는 AWS RDS Mysql 사용 했습니다.
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
		'NAME': get_env_variable('DATABASE'),
        'USER': get_env_variable('DB_USER'),
        'PASSWORD': get_env_variable('DB_PASSWORD'),
        'HOST': get_env_variable('DB_HOST'),
        'PORT': get_env_variable('DB_PORT'),
        'OPTIONS':{
            'init_command' : "SET sql_mode='STRICT_TRANS_TABLES'"
        }

정적 파일 경로 지정 및 모으기

→ 이거 안 하면 배포후 admin 페이지에서 css가 적용 안된다.

import os 

STATIC_ROOT = os.path.join(BASE_DIR, "static")

다음 명령으로 정적 파일 모으기 → 프로젝트 폴더에 static 폴더가 생성 됨 → 깃헙 레파지토리에 같이 올리면 됨

💡 python manage.py collestatic

미디어 파일 경로 직접 지정

→ 이거 안 하면 배포후 미디어 파일 경로를 읽지 못 한다.

from django.views.static import serve
from django.urls import re_path

urlpatterns = [
		.
		.
		re_path(r'^media/(?P<path>.*)$', serve, {'document_root':settings.MEDIA_ROOT}),
]

정적 파일을 위한 기존 아래 코드는 지워도 된다.

💡 urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

참고

혹~시 static 파일도 필요하다면 위 방법과 같이 아래 url을 추가해 주면 된다.

urlpatterns = [
		re_path(r'^static/(?:.*)$', serve, {'document_root': settings.STATIC_ROOT, },
]

아래 설정은 개발 하면서 썼겠지만 혹시 해서 써놓겠습니다.

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

클라우드타입에 올리기 - Github repository 이용

새 애플리케이션 생성

검색창에 django 검색해서 선택

Cloudtype 계정에 Github가 연결 안 되어 있으면 연결하고, 배포할 깃헙 저장소 선택하기

저장소 옆 ‘설정’을 눌러 배포할 브랜치 선택 가능

‘설정변경’을 눌러 빌드 설정하기

애플리케이션 이름, 버전을 선택

환경 변수 설정하기

DJANGO_SECRET 옆에 + 버튼 누르면 입력 창 추가 가능

아래와 같이 정보를 입력해 준다.

💡 여기서 주의 할것!! 장고 슈퍼유저 정보를 입력하는데 기존에 만들어 놨던 슈퍼유저 정보를 넣으면 안됨!!(오류남) 새로 만들 슈퍼유저 정보를 기입하면 된다. 이부분은 좀 이상하다 생각.. **특히 재배포 할때마다 슈퍼유저를 새로운 정보로 새로 생성해줘야 한다.** 장고에서 슈퍼유저는 여러개 생성 가능해서 상관은 없다. 배포 후 admin 페이지로 가서 필요 없는 슈퍼유저를 삭제 하면 된다.

  • Environment Variables
    • DJANGO_SUPERUSER_USERNAME - Django 슈퍼유저 username
    • DJANGO_SUPERUSER_PASSWORD - Django 슈퍼유저 password
    • DJANGO_SUPERUSER_EMAIL - Django 슈퍼유저 email
  • Pre Start Command
    • python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py createsuperuser --noinput
  • Start Command
    • python3 manage.py runserver 0:8000

프로젝트 확인 후 배포하기

아래와 같이 배포 빌드가 완료 되고

파란색 ‘Running’ 상태로 변경되면 끝

보통 10분 이내로 되는것 같습니다.

오른쪽에 표시해둔 버튼 누르면 실행로그 창을 볼 수 있어요

Runnring 상태로 안 넘어가면 여기서 어떤 오류가 발생했는지 확인하세요!!

밑에 있는 기본으로 생성된 도메인으로 들어가면 404뜰텐데,

(주소)/admin/ 로 가서 어드민 페이지가 제대로 뜨면 성공

두 개 도메인 중 위에것은 제가 따로 만든 도메인으로 일단 무시하셔도 됩니다. 도메인 생성 및 연결 방법은 바로 알려 드리겠습니다.

위 도메인으로 api 사용 가능하니 테스트 해보자

참고

로컬에서 개발 할때 장고 3.2 버전 미만에서 했다면 배포시 수행되는 migrate에서 아래 오류가 발생한다.

Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'

django 3.2부터는 모델의 primary key의 속성을 설정해 줘야 한다. 아래 블로그를 참고하면 해결 가능하다.
https://uiandwe.tistory.com/1304

profile
나야, 개발자

2개의 댓글

comment-user-thumbnail
2024년 10월 31일

혹시 디비는 어떻게 해결하셨나요?
재배포시 배포 중에 저장된 디비는 날아가는거같아서요..

1개의 답글