Django 프로젝트 생성 후 데이터베이스(mysql)를 연동하고, 필요한 설정 정보(settings.py)엔 무엇이 있는지 알아보고, Git 을 통해 프로젝트를 관리하는 방법에 대해 알아보자.
# 가상환경 리스트 확인
$ conda env list
# 가상환경 삭제
$ conda env remove --name (가상환경이름)
# 새 가상환경 만들기
$ conda creat -n (가상환경이름) python=3.8
# 해당 가상환경 실행하기
$ conda activate (가상환경이름)
# 가상환경 벗어나기
$ conda deactivate (가상환경이름)
# mysql실행해서
mysql -u root -p
# 인코딩 방식을 정해서 데이터 베이스 만들기
mysql> create database (db이름) character set utf8mb4 collate utf8mb4_general_ci;
# 만든 DB 확인하기
mysql> show databases; # 전체 db 리스트보기
mysql> use (DB이름); # 특정 db 선택하기
mysql> show tables; # 선택한 db의 테이블 보기
mysql> exit or quit # mysql 종료
데이터베이스 만들때 문법 에러가 나면 mysql 예약어가 포함된걸 수도 있다. → 백틱(`)으로 감싸준다.
utf8mb4 의미?
각 character 는 최대 4 byte 의 UTF-8 인코딩을 지원한다. (이모지와 특수 문자도 문제 없음)
MySQL 커맨드 라인 자동완성을 위한 mycli 설치
MacOS
$ brew update && brew install mycli
Ubuntu
$ sudo apt-get install mycli
$ mycli -u root # 실행하기
mysql > use mysql;
mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '사용할 비밀번호 입력';
mysql > FLUSH PRIVILEGES;
# 장고 설치
$ pip install django
# 이후에 MySQL server에 접속하기 위한 package
$ pip install mysqlclient
# cors headers는 아래 설명
$ pip install django-cors-headers
# 파이썬 버전 확인
$ python --version
# 장고 버전 확인
$ python -m django --version
# 설치된 패키지 확인하기
$ pip freeze 혹은 $ conda list
$ django-admin startproject (프로젝트이름) (.) # 마침표가 붙으면 현재 폴더에 생성
$ cd (프로젝트폴더)
현 위치에 프로젝트 이름으로 폴더가 생성된다.
만약 미리 폴더를 만들어두었다면 이름 뒤에 마침표를 붙여서 생성한다.
루트 폴더에 위치하며 서버를 실행하는 파일이다.
파일을 실행시 __name__
== __main__
되며 함수가 작동한다.
settings.py 파일의 설정에 따라 실행하겠다는 내용이 있다. (set default)
<- 파이썬은 멀티스레드를 지원한다.- >
프로그램이 실행이 되면 메모리에 올라가고 프로세스 상태가 된다.
프로세스마다 메인스레드가 있는데 메인스레드에 실행되는 코드가 manage.py 파일의 코드이다.
해당 폴더를 모듈이 아닌 패키지로 다루도록 알려준다.
__는 dunder (Double UNDERscore) 라고 부르며 파이썬의 매직 메서드이다.
프로젝트의 URL을 선언하며 사이트의 <목차>라고 할 수 있다.
django.contrib
패키지의admin
모듈을 사용하지않는다면 주석 처리하자.urlpatterns
의admin
경로도 주석 처리하자.
Web Server Gateway Interface (웹 서버 게이트 인터페이스)
웹 서버(Apache, Nginx 등)와 웹 어플리케이션(Python)간 소통을 위한 인터페이스. (미들웨어)
CGI보다 상위 개념
Asynchronous Server Gateway Interface (비동기 서버 게이트 인터페이스)
비동기 서버동작을 구현할때 사용하며 웹 소켓, 챗봇 등 연결 시간이 긴 경우에 적합하다.
WSGI보다 상위 개념
절대경로의 기준이되는 root directory 설정부터 프로젝트 전체에 적용할 설정을 할 수 있다.
setting.py는 전역으로 설정을 하는 것이고, 여러 app이 있다면 공통적으로 적용된다.
아래는 로컬 개발 환경에서 임의 세팅 값
ALLOWED_HOSTS
: * 로 호스트 전부 허용하기
INSTALLED_APPS
, MIDDLEWARE
: 필요없는 부분 주석 처리 (admin, csrf, auth 기능들)
ex:) CSRF(크로스 사이트 요청 위조) 공격을 대비하는 기능
미들웨어란?
URLconf에 요청이 오기전에 중간에서 점검을 한다.
flask와는 다르게 django는 포함되어 있다.
DATABASES
항목 정보 작성
ENGINE
을 수정하고, HOST
, PORT
, USER
, PASSWORD
등 추가 설정한다.
MySQL의 DB 포트 번호는 3306이다.
TIME_ZONE
설정
한국기준 설정은 Asia/Seoul
USE_TZ=False
이다.
my_settings.py
만들고 연동하기
SECRET_KEY
와 DATABASES
세팅은 깃허브에 공개하면 안된다.
공개를 원치않는 설정정보는 my_settings.py
에 넣어서 .gitignore
에 추가한다.
# settings.py
from pathlib import Path
from my_settings import DATABASES, SECRET_KEY # my_setting.py에 따로 import
...
DATABASES = DATABASES # 가려준다
SECRET_KEY = SECRET_KEY # 가려준다
브라우저 보안 정책으로 다른 도메인을 가진 서버의 URL을 호출해 데이터를 가져오려고 하는 경우
보안 문제인 Cross Domain 이슈를 발생시킨다.
→ 자신과 동일한 도메인에 한해서만 요청을 허용하고 처리해준다.
서버에서 보내는 요청의 헤더(Access-Control-Allow-Origin response 헤더)에
cross origin HTTP 요청을 허가해 접근을 허락하는 내용을 추가해 주면 된다.
$ pip install django-cors-headers
settings.py
에 설정 추가하기# settings.py
INSTALLED_APPS = [
...
'corsheaders'
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 가능한 높게 위치시키자!
...
...
]
# 파일 하단 부분에 허용할 값 정의. OPTIONS나 토큰관련은 주의할것.
##REMOVE_APPEND_SLASH_WARNING
APPEND_SLASH = False
##CORS
CORS_ORIGIN_ALLOW_ALL=True # 모든 호스트를 허용한 상태 (부분적으로 하려면 WHITELIST 작성)
CORS_ALLOW_CREDENTIALS = True # 쿠키가 cross-site HTTP 요청에 포함될 수 있는지
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',
)
위 설정은 로컬 개발환경 기준으로 모든 요청을 수락한 것이고, 배포용 설정은 다를 수 있다.
설정참고 블로그 : https://oen-blog.tistory.com/46
Github repository - https://github.com/adamchainz/django-cors-headers
python manage.py runserver # 기본 8000 포트
python manage.py runserver 8080 # 8080 포트로 변경
- 서버 실행시 나오는 migration 에러는 Django에서 전체적으로 적용할 migrate가 있다는 뜻이다.
- 첫번째 앱을 migrate 할때 app 이름을 명시하지 말고 전체적인 migrate를 진행하자.
pip freeze
를 통해 패키지 환경 정보를 확인하고 문서화한다.
django
, django-cors-headers
, mysqlclient
버전 등
각종 키워드 추가하여 .gitignore
파일 만들고, my_settings.py
파일을 연결하기.
ex) python, pycharm, VisualStudioCode, vim, macOS, Linux, zsh
Git 초기화 후 Commit 해서 main branch로 push하는 법
git init
git add .
git commit "CREATE: 프로젝트 초기 셋팅"
# Github에서 저장소 만들고
git branch -m (전이름) (새이름) # master를 main으로 바꾸기
git remote add origin (주소)
git push origin (브랜치이름)
참조목록
WSGI, CGI, ASGI
https://tibetsandfox.tistory.com/22
Django와 MySQL 연동
https://nachwon.github.io/database-mysql/
CORS와 해결방법