Django 프로젝트 전에 꼭 알아야할 11가지
- 1. 참고
- 2. 요약
- 1) Postgres DB엔진을 쓸 것
- 2) Unit Test를 위한 infra-structure를 구성할 것
- 3) DRF로 Restful하게 만들 것
- 4) Django model field의
help_text
를 사용할 것 - 5) Django의 URL 적용할 것 - 쿼리 문자열 쓰지 않기
- 6) Django ORM 최대한 사용하기
- 7)
django-extensions
와Django-model-utils
사용하기 - 8) Sentry 사용할 것
- 9)
django-debug-toolbar
- 최적화, 디버깅 - 10) Custom User Model 처음부터 쓰기
- 11)
django-suit
등 django admin의 대체품 사용하기
- 3. 그 외 권고 사항들
1. 참고
Joseph Misiti - 11 Killer Features I use in Every Django Project
- raccoony의 번역 - 2014년에 Django로 개발하면서 실수한 부분
- 이 글은 위 사이트의 내용을 요약 정리한 것입니다.
Joseph Misiti -11 Things I Wish I Knew About Django Development Before I Started My Company
2. 요약
1) Postgres DB엔진을 쓸 것
- Django ORM 지원하지 않는 MongoDB등은 Django admin이나 3rd party 라이브러리를 사용할 수 없다.
- Postgres가 2014. 12. 18.부터 JSONB 데이터 타입을 지원하기 시작하였으므로 Postgres에 문서를 저장할 수 있고, 성능 저하 없이 MongoDB처럼 쿼리를 실행할 수 있다.
- pycharm Professional edition(유로버전)이 제공하는 Database tool window 기능을 활용하자. DB접근이 쉬워진다.
2) Unit Test를 위한 infra-structure를 구성할 것
3) DRF로 Restful하게 만들 것
Vue.js
,Angular.js
등 클라이언트 MVC 프레임워크의 수가 급증하므로 REST API를 구현할 DRF( django-rest-framework )를 사용하는 것이 좋아.
4) Django model field의 help_text
를 사용할 것
help_text
속성은 Django의 폼 화면이나 admin 화면에 나타나고 문서화에도 도움이 된다.
5) Django의 URL 적용할 것 - 쿼리 문자열 쓰지 않기
https://www.example.com/user?id=20
대신 **https://www.example.com/user/20/
를 쓰자. 컨트롤러(view.py
)에서 타입 검사 같은 코드를 덜 작성하기 때문이다.
6) Django ORM 최대한 사용하기
DB의 스키마 설계에 공을 많이 들이는 것이 좋다. 이때 Django ORM을 최대한 이용하면 잘못된 데이터를 저장하는 일 없이 수 많은 문제가 해결된다. 특히 DB 제약조건을 정확히 지정하는 것이 좋다.
- null 값을 가질 수 없는 필드에는 null=True를 설정하지 마세요.
- 고유한 값을 저장하는 필드들은 unique_together로 지정해주세요.
- unique 파라미터도 적절히 사용해 주세요.
- max_length도 알맞게 지정하세요.
7) django-extensions
와 Django-model-utils
사용하기
-
django-extensions
- 매우 뛰어난 3rd party library - ❶ printing settings,❷ shell_plus, ❸ dumping scripts, ❹ encryption, etc
-
django-model-utils
- Django ORM에서 지원하지 않거나 구현 방식이 조금 다른 유용한 기능들을 제공함 - ❶ TimeStampField, ❷ MonitorField, ❸ Choices 등
8) Sentry 사용할 것
- 가입형은 한 달에 $24부터 시작하며, 이 돈을 낼 만한 가치가 충분하다.
9) django-debug-toolbar
- 최적화, 디버깅
- SQL 쿼리와 요청, 템플릿, 캐시 등을 모두 추적할 수 있다.
10) Custom User Model 처음부터 쓰기
User 모델에 필드를 추가할 때도 기존의 방법(기본 User 모델과 OneToOne으로 엮인 새 모델을 만드는 방법)보다 직관적입니다. Django를 이미 사용하고 있다면 기본 User 모델의 email과 username 필드가 30 글자로 제한되어서 답답했을 겁니다. 커스텀 User 모델을 도입하면 이런 문제들이 모두 해결됩니다.
11) django-suit
등 django admin의 대체품 사용하기
- django-suit, django-grapelli
- Django Admin interface
3. 그 외 권고 사항들
1) 올바른 디렉토리 구조로 시작할 것
- 아래는 하나의 예시에 불과하다.
┌─ apps/ # customized django apps
├─ vendor/ # pip 등으로 설치할 수 없는 apps
├─ bin/ # all bash scripts that automate development
├─ config/
├─ media/
├─ static/
├─ templates/
├─ manage.py
└─ README.md
2) Celery- 비동기처리와 정기적 반복 처리
- celery backend로 RabbitMQ보다 redis를 추천한다.
- Facebook API로 가져온 데이터를 이메일로 보낸는 작업에 쓰인다.
- 정기적인 반복 처리에도 UNIX crontab 대신 **celery를 사용하자.
3) named URLs/reverse
- 당연한 얘기지만 URLs에서 name을 반드시 정하고, url template tag에서 사용할 것 - 이는 나중에 url이 변동될 때 하드 코딩을 막아준다.
4) settings.py 분리
- multiple layered settings files
- development, staging 그리고 production 단계별로 settings.py를 분리해야 한다.
settings/
├─ __init__.py
├─ local.py
├─ dev.py
└─ production.py
5) supervisor for monitoring
- 배치(deploying) 시 모든 프로세스를 감시/관리할 수 있도록 supervisor를 사용하자.
6) AJAX/JSON 사용할 것
-
모든 HTTP 요청마다 페이지 전체로 reload할 것이 아니라면 AJAX를 써야 한다. 문제는 Django에 내장 JSON HTTP response가 없다는 점이다.
-
관련 코드
7) Redis를 사용할 것
- celery jobs이나 session을 저장하는 것, cache로 사용하는 것, 자동 완성 등을 구현할 수 있다.
8) munin
이나 statds
를 process mornitoring에 사용할 것
- 관련 코드와 사이트는 아래와 같다.
9) jammit
for static asset compression 사용
- jammit은 static asset(css, javaScript 등)을 압축하는 모듈인데 ruby on rails에서 사용도니다. 그러나 python에서도 사용할 수 있는데 관련 사이트는 아래와 같다.
[jammit.py](https://github.com/samuelclay/NewsBlur/blob/master/utils/jammit.py)