TIL 24. Django - Project Setting

문승준·2021년 9월 13일
0

Django

목록 보기
2/7
post-thumbnail

Django 프로젝트 생성 후 데이터베이스(mysql)를 연동하고, 필요한 설정 정보(settings.py)엔 무엇이 있는지 알아보고, Git 을 통해 프로젝트를 관리하는 방법에 대해 알아보자.


1. 가상환경 생성

# 가상환경 리스트 확인
$ conda env list

# 가상환경 삭제
$ conda env remove --name (가상환경이름)

# 새 가상환경 만들기
$ conda creat -n (가상환경이름) python=3.8 

# 해당 가상환경 실행하기
$ conda activate (가상환경이름)

# 가상환경 벗어나기
$ conda deactivate (가상환경이름)

2. MySQL DB 생성

# 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 # 실행하기
  • (추가) root 로그인시 sudo 안쓰는 설정
mysql > use mysql;
mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '사용할 비밀번호 입력';
mysql > FLUSH PRIVILEGES;

3. Django와 MySQL client 패키지 설치

# 장고 설치
$ 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 

4. Django 프로젝트 생성

$ django-admin startproject (프로젝트이름) (.) # 마침표가 붙으면 현재 폴더에 생성

$ cd (프로젝트폴더)
  • 현 위치에 프로젝트 이름으로 폴더가 생성된다.

  • 만약 미리 폴더를 만들어두었다면 이름 뒤에 마침표를 붙여서 생성한다.


5. Django 프로젝트 파일구조

  • 프로젝트 mysite 생성 예시

manage.py

루트 폴더에 위치하며 서버를 실행하는 파일이다.

파일을 실행시 __name__ == __main__ 되며 함수가 작동한다.

settings.py 파일의 설정에 따라 실행하겠다는 내용이 있다. (set default)

<- 파이썬은 멀티스레드를 지원한다.- >

프로그램이 실행이 되면 메모리에 올라가고 프로세스 상태가 된다.

프로세스마다 메인스레드가 있는데 메인스레드에 실행되는 코드가 manage.py 파일의 코드이다.

project/init.py

해당 폴더를 모듈이 아닌 패키지로 다루도록 알려준다.

__는 dunder (Double UNDERscore) 라고 부르며 파이썬의 매직 메서드이다.

project/urls.py

프로젝트의 URL을 선언하며 사이트의 <목차>라고 할 수 있다.

  • django.contrib 패키지의 admin 모듈을 사용하지않는다면 주석 처리하자.
  • urlpatternsadmin 경로도 주석 처리하자.

project/wsgi.py

Web Server Gateway Interface (웹 서버 게이트 인터페이스)

웹 서버(Apache, Nginx 등)와 웹 어플리케이션(Python)간 소통을 위한 인터페이스. (미들웨어)

CGI보다 상위 개념

project/asgi.py

Asynchronous Server Gateway Interface (비동기 서버 게이트 인터페이스)

비동기 서버동작을 구현할때 사용하며 웹 소켓, 챗봇 등 연결 시간이 긴 경우에 적합하다.

WSGI보다 상위 개념

project/settings.py

절대경로의 기준이되는 root directory 설정부터 프로젝트 전체에 적용할 설정을 할 수 있다.


6. settings.py 설정하기

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_KEYDATABASES 세팅은 깃허브에 공개하면 안된다.

    공개를 원치않는 설정정보는 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 # 가려준다

7. cors-headers 설치 및 추가

  • CORS (Cross Origin Resource Sharing) 란?

브라우저 보안 정책으로 다른 도메인을 가진 서버의 URL을 호출해 데이터를 가져오려고 하는 경우

보안 문제인 Cross Domain 이슈를 발생시킨다.

→ 자신과 동일한 도메인에 한해서만 요청을 허용하고 처리해준다.

  • CORS 문제 해결 방법

서버에서 보내는 요청의 헤더(Access-Control-Allow-Origin response 헤더)에

cross origin HTTP 요청을 허가해 접근을 허락하는 내용을 추가해 주면 된다.

  • django-cors-headers 라이브러리 설치하기
$ 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',
)

8. 프로젝트 서버 실행 해보기

  • 프로젝트 폴더로 이동 후 해당하는 가상환경을 실행한다.
  • 아래 명령을 통해 서버실행
python manage.py runserver      # 기본 8000 포트

python manage.py runserver 8080 # 8080 포트로 변경
  • 서버 실행시 나오는 migration 에러는 Django에서 전체적으로 적용할 migrate가 있다는 뜻이다.

  • 첫번째 앱을 migrate 할때 app 이름을 명시하지 말고 전체적인 migrate를 진행하자.

9. requirements.txt

  • pip freeze를 통해 패키지 환경 정보를 확인하고 문서화한다.

  • django, django-cors-headers, mysqlclient 버전 등


10. Git & Github

  • 각종 키워드 추가하여 .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 (브랜치이름)

profile
개발자가 될 팔자

0개의 댓글