이 포스팅에서 실제 프로젝트의 진행을 위해 필요한 설정 정보(settings.py)와, 데이터베이스(mysql)를 연동하고 Git 을 통해 초기 세팅과 프로젝트를 관리하는 방법을 다루어보겠습니다. (+ runserver error를 해결한 방법)
세팅 방법은 회사마다, 프로젝트마다, 선호하는 방법에 따라 다 다르기 때문에 정답은 없습니다.
해당 루트에 가상환경을 생성합니다.
conda create -n "가상환경 이름" python=3.9
conda activate "가상환경 이름"
터미널에 mysql을 실행하고 데이터베이스를 만듭니다. utf8mb4
은 utf8의 서브셋으로 한글이나 일본어, 이모지 같은 비 라틴계 언어들에 대해서 조금 어색한 정렬 순서들이 존재하기 때문에 utf8mb4_unicode_ci
를 사용하는 것을 추천합니다.
$ mysql -u root -p
mysql> create database 이름 character set utf8mb4 collate utf8mb4_general_ci;
mysql> show databases;
로 데이터베이스가 잘 생성되었는지 확인합니다.
$ pip install django
# 이후에 MySQL server에 접속하기 위한 package
$ pip install mysqlclient
# mysql 설치되어 있는지 먼저 확인!
pip install django
pip install mysqlclient
# 이후에 MySQL server에 접속하기 위한 package
원하는 위치에 다음과 같이 입력합니다.
django-admin startproject config .
cd westarbucks
위의 코드는 config라는 프로젝트를 생성하는데 상위의 config 껍데기 폴더(config 프로젝트를 담는 폴더)를 만들지 않고 프로젝트를 만들라는 의미입니다.
(배포모드 말고 개발모드에서) 모든 ip를 허용합니다.
ALLOWED_HOSTS = ['*']
그리고 장고가 기본적으로 제공하는 admin, auth를 사용하지 않기 때문에 다음과 같이 주석처리 합니다.
그리고 해당 위치를 사용하지 않기 때문에 urls.py도 또한 수정합니다.
from django.urls import path
urlpatterns = [
# path('admin/', admin.site.urls), # 또는 삭제
]
깃으로 관리를 하게 될텐데 프로젝트의 중요한 값들은 따로 환경변수(env)를 설정해주어서 관리를 해야 합니다. 아니면 눈뜨고 코 베이징~
아래는 별도의 참조용 파이썬 파일(secret.py)을 생성해서, 참조하는 방법입니다.(해당 폴더에서 작업합니다.)
touch secret.py
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DATABASE 명',
'USER': 'DB접속 계정명',
'PASSWORD': 'DB접속용 비밀번호',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
SECRET_KEY = '시크릿키' #settings.py에 있는
secret_key 를 사용합니다.
from my_settings import DATABASES, SECRET_KEY
...
DATABASES = DATABASES
SECRET_KEY = SECRET_KEY
M1은 mysql세팅을 위해 다음과 같은 코드를 추가로 입력합니다.
pip install PyMySQL
pymysql package 설치 후 settings.py에 추가
from pathlib import Path #기존에 settings.py 에 있는 코드
from my_settings.py import DATABASES, SECRET_KEY
import pymysql
pymysql.install_as_MySQLdb()
웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조입니다. Django 로 REST Api 를 만들었는데 Front 연결을 해야할때 설정을 해주지 않으면 CORS 오류가 납니다.
pip install django-cors-headers
INSTALLED_APPS = [
...
'corsheaders'
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
]
##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',
)
/
관련 에러 제거APPEND_SLASH = False
다음의 코드로 서버를 실행합니다.
python manage.py runserver
가상환경에서 들어간 후 서버가 잘 실행되었다면 다음의 화면이 나옵니다.
하지만 저같은 경우는 서버로 연결할 부분을 찾지 못하고 다음의 에러를 내뱉었는데요🥶
File "manage.py", line 17
) from exc
^
SyntaxError: invalid syntax
이같은 오류는 보통 다음의 경우에서 발생합니다.
- 가상환경이 실행되지 않았거나
- 가상환경에 장고가 설치되어있지 않거나
- M1 프로세서를 사용하거나..
4. conda로 장고를 설치했거나!
따라서 다음과 같이 해결합니다.
conda activate 환경이름
pip install django
manage.py와 폴더위치가 수평일 때가 아니거나
그래도 안된다면 아마 M1 프로세서를 사용하거나..?
--> 특히 M1을 사용할 때 서버를 찾지 못하는 경우가 많습니다. 다음의 과정을 따라오세요.
1) conda 환경에서 pipenv shell
을 입력합니다.
사진과 같이 가상환경이 제작됩니다.
pipenv 환경은 conda와 비슷한 환경으로 프로젝트별로 관리하는 '버블'이라고 생각하면 편합니다.
2) pipenv 환경에서 conda 가상환경을 실행합니다.
3) (리눅스 터미널 명령어)ls
로 manage.py가 보이는 위치까지 이동합니다.
4) 그리고 pipenv 환경에 conda 가상환경이 실행된 환경에 장고를 설치합니다. 그러면 (pipenv 환경이름) (콘다 환경이름)
으로 표시되고 여기서 작업합니다.
이 단계를 잘 따라오면 아마 서버가 잘 실행될거에요.. (안 된다면 댓글 부탁드립니다.)
중요!
컴퓨터 전원을 끄거나, 환경에 나가는 등 프로젝트에서 완전히 나간 상태라면 다시 실행할 때 pipenv shell로 들어와 conda 가상환경을 activate해줍니다!!! 순서를 지켜주세요!
그런데 말입니다....
conda install django
하셨습니까.....?
pip install django
를 하니 멀쩡하게 잘 돌아갑니다... 이때까지 conda로 장고를 설치해서 오류가 났고 pipenv를 사용했는데, pip으로 설치해야겠습니다. 아니면 팀프로젝트할 때 팀원들의 installing 항목을 일치시킬수도 없고, 팀원들도 저의 세팅을 맞추기 힘들 수 있습니다...!
pipenv shell # pipenv shell 환경에 접근 후
conda activate 환경이름 # conda 환경에 접근합니다.
서버를 실행하면 mysql 오류가 나오는 분이 간혹 있었습니다.
사용자의 비밀번호가 없을 경우 나타나는 오류 문구로, 아래 해결 방법에 있는 명령어들 중 하나를 선택해 입력합니다.
사용자의 비밀번호가 틀렸을 경우 나타나는 오류 문구, 아래 해결 방법에 나와있는 명령어들을 입력합니다.
mysql > use mysql
mysql > update user set password=password('비밀번호') where user='사용자'; // 비밀번호 변경
mysql > flush privileges; // 변경사항 적용
만약에 비밀번호를 잊어버렸을 경우 아래의 방법대로 진행하면 됩니다.
mysqld --skip-grant // 인증 없이 mysql 진입
위의 유형 2번처럼 비밀번호 재설정으로 완료합니다!
짜잔!