{"id":29370939,"url":"https://github.com/nuung/django-all-about","last_synced_at":"2025-07-09T14:11:44.140Z","repository":{"id":108641066,"uuid":"550784903","full_name":"Nuung/django-all-about","owner":"Nuung","description":"[ Django \u0026 DRF ] django-all-about, can be a good study material for someone and a good boilerplate for someone","archived":false,"fork":false,"pushed_at":"2023-10-19T06:15:43.000Z","size":23683,"stargazers_count":12,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-04-18T09:24:07.118Z","etag":null,"topics":["celery","celerybeat","django","django-rest-framework","docker","docker-compose","mongodb","postgresql","python","python3","redis"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Nuung.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-10-13T10:19:15.000Z","updated_at":"2024-03-29T16:00:04.000Z","dependencies_parsed_at":"2023-09-22T08:41:51.888Z","dependency_job_id":"b403bce3-1bb6-4ffc-884a-791387ac3653","html_url":"https://github.com/Nuung/django-all-about","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Nuung/django-all-about","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nuung%2Fdjango-all-about","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nuung%2Fdjango-all-about/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nuung%2Fdjango-all-about/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nuung%2Fdjango-all-about/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Nuung","download_url":"https://codeload.github.com/Nuung/django-all-about/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nuung%2Fdjango-all-about/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264473897,"owners_count":23613961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["celery","celerybeat","django","django-rest-framework","docker","docker-compose","mongodb","postgresql","python","python3","redis"],"created_at":"2025-07-09T14:11:43.171Z","updated_at":"2025-07-09T14:11:44.125Z","avatar_url":"https://github.com/Nuung.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FNuung%2Fdjango-all-about\u0026count_bg=%23978AFF\u0026title_bg=%23707070\u0026icon=django.svg\u0026icon_color=%23E7E7E7\u0026title=hits\u0026edge_flat=false)](https://hits.seeyoufarm.com)\n\n\u003ccenter\u003e\n\n  ![](./imgs/img2.png)\n\n\u003c/center\u003e\n\n***[ 아직 완성이 아닙니다! 지속적으로 아래 해당하는 주제들이 코드 level에서도 업데이트 될 예정입니다!!! ]***\n\n# All About Django (almost)\n\n\u003e [블로그 글](https://velog.io/@qlgks1/series/Django-Basic-to-Advanced) 과 같이 본다면 더 이해하기 쉽다.\n\u003e Django 로 가능한 다양한 형태의 실습, 테스트 케이스\n\u003e complex - boilerplate\n\n- 우선 config, settings 값 등 환경 변수로 다뤄야 할 것들을 철저하게 단순 **테스트를 위해 파일에 같이 저장되어 있는 점 유의**\n- DB 관련도 DBMS와 소통할 때 **auth, localhost 인 점도 꼭 유의** , mongodb 는 auth가 optional\n- User는 refresh 없는 1년 유효 jwt token (django simplejwt), 인가는 drf 기본 Authorization만 사용\n  - User 대충하려다가 조금 token 세팅 빡세게 해버렸다..\n- admin (super user)는 특별한 custom 없이 진행\n- exception은 커스텀 없이 진행\n\n## Infra \u0026 Requirements\n\n- Django + DRF (Django RestFrameWork)\n- Gunicorn (wsgi)\n- Celery, Celery Beat\n- Redis\n- Postgresql (***3대***, not clustering, each stand alone)\n  - default Postgresql에 DATABASE를 2개 나눠서 사용 (daa-postgres-db \u0026 daa-postgres-order-db)\n  - Insert-Update-Delete-only DB : **`default`**\n  - Select-only DB (**duplication**) : **`sub`**\n  - just back-up (**duplication**) DB\n- Mongodb\n  - dbrouter에 따로 등록하지 않고, django ORM 사용하지 않음\n  - 특수 목적을 대상으로, pymongo와 같은 **ODM 활용**\n- Nginx\n- DevOps: Monitoring \u0026 Debugging\n  - Flower\n  - Prometheus\n  - Grafana \u0026 Loki \u0026 Promtail\n- Kafka cluster\n  - 3 zookeper \u0026 3 kafka \u0026 kafka-manager\n\n## 🔥 Getting Started\n\n### 1) requirements\n\n1. git\n2. docker \u0026 docker compose\n3. MacOS or Linux Based OS (recommanded)\n\n### 2) project init \u0026 start\n\n1. `git clone`\n\n2. 우선 `docker` 하위에 있는 `env` 파일을 `django_all_about/config/settings` 로 copy \u0026 paste 하자\n- 이름은 `.env` 로 copy 한다. 이유는 `python-environ` 모듈을 사용하기 때문이다.\n- 참고로 env 값 바뀌면 2개의 file을 update 해주자, `django_all_about \u003e .env` \u0026 `docker \u003e env`\n- 그리고 `django_all_about` 하위 `.env`는 **버전관리 대상에서 빠진다.**\n- `cp ./docker/env ./django_all_about/config/settings/.env` (최상위 경로 기준 커멘드)\n\n3. `django_all_about` 가서 필수 base image가 될 django image를 만들자\n- 참고로 `django_all_about` 경로 이동을 꼭 해야한다! 상대 경로 설정들 때문!\n- `docker build -t daa-django -f ./Dockerfile .`\n- 해당 경로에 ***러닝 스크립트 관련 scripts***, `requirements.txt` 가 있으니 필참\n\n4. `docker` 디렉토리로 가서 `docker-start.sh` 실행 (ex - `source docker-start.sh`)\n- 상대 경로 등의 설정으로 인해 **꼭 해당 디렉토리로 가서 shell을 실행**시키자.\n- 최초 실행시 celery-beat 등의 경우 migrate issue로 죽을 수 있으니 re-start를 다시 해주자\n- 모든 실행후 http://localhost/admin 으로 접속\n  - 8000으로 바인딩했으면서 왜 80으로 가냐? docker - nginx conf 참조, 리버스 프록시 세팅 모두 되어있음\n\n5. [optinal] VScode Python Linting \u0026 Debugging\n- [python - flake8, Black](https://velog.io/@qlgks1/Python-flake8-Black-%EB%8F%84%EC%9E%85-clean-code-%EC%8B%A4%EC%B2%9C%ED%95%98%EA%B8%B0#vscode-git%EA%B3%BC-%EC%84%9E%EC%96%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0) 글과 같이 flake8, Black \u0026 flake8, pre-commit 으로 linting 가능하다. (`.flake8` \u0026 `.pyproject.toml` 참조)\n- vscode에서 save시 linting과 같은 세팅도 되어있다. (`.vscode \u003e settings.json` 참조)\n- vscode에서 디버깅 러닝도 가능한 (runserver debugging \u0026 shell debugging) 세팅도 되어 있다. (`.vscode \u003e launch.json` 참조)\n\n### 3) Local (self) Development\n\n\u003e 우선 `django_all_about \u003e\u003e logs` file logging을 사용하기 때문에 디렉토리 만들어줘야합니다.\n\n1. 개발 환경 구성하기\n- 추천하는 방법은 vs-code 등에서 \"docker - django\" (hostname: `daa-django`)에 붙어서 작업하는 것이다.\n- 위 항목 (5)에서 vscode 디버깅을 그대로 사용하려면, 컨테이너에 붙어서 러닝해야 한다 :)\n\n2. 실행만 도커, 작업은 로컬로 구성하기\n- `python -m venv .venv \u0026 pip install -r requirements.txt` 을 통해 직접 local 환경 구성을 해서 진행을 해도 괜찮다.\n- `python manage.py migrate` \u0026 `python manage.py migrate --database=orders` 다중 DBMS \u0026 다중 데이터베이스 세팅으로 꼭 해주셔야 합니다.\n- 그 이외 실행 관련된 커멘드는 `scripts` 하위 `start-django.sh` 를 보는게 좋다.\n\n### 4) Development - DB detail config\n\n1. mongo user 만들기\n- mongo container shell 접근\n- mongo --host 127.0.0.1 --port 29019\n```shell\nuse admin\ndb.createUser(\n  {\n    user: \"nuung\",\n    pwd:  \"daa123!\",\n    roles: [ { role: \"root\", db: \"admin\" } ]\n  }\n)\ndb.runCommand('usersInfo')\n```\n- 이후 `settings \u003e local.py` 의 DB 값 에서 다음 값을 바꿔주면 된다.\n```python\n  ...\n  # 'username': '몽고DB 사용자 계정을 넣어주세요',\n  # 'password': \"몽고DB 사용자 비밀번호 넣어주세요\",\n  'username': 'nuung',\n  'password': 'daa123!',\n  ...\n```\n\n2. app 추가를 하려면\n- 우선 apis 하위에 추가하려는 app의 디렉토리 (폴더)를 하나 추가한다.\n- 그리고 `python manage.py startapp products ./apis/products` 커멘드로 세팅한다\n- `urls.py` 와 `serializers.py` 추가로 세팅해서 사용하면 된다.\n- `apps.py` 세팅값도 살짝 바꾸는게 좋은데, 이미 있는 것을 참고하길 바란다.\n\n3. 분리된 config \u003e setting 에서 `manage.py shell` 에 접근할 때에는 `python manage.py shell --settings=config.settings.local` 와 같이 option을 추가해 줘야 한다.\n\n4. 기본적인 url 들은 아래와 같다\n- `localhost` : main, index but not used\n- `localhost/admin` ; django의 핵심, admin 페이지 이다.\n- `localhost/swagger/` : 스웨거는 꼭 들어가 보길, 말그대로 swagger로 API 정리되어있는 문서다. drf와 drf_yasg 의 합작이다.\n- `localhost/api/...` : API endpoint 의 pre-fix로 \"api\" 가 붙는다.\n\n5. `python manage.py shell --setting=config.settings.local \u003c ./apis/products/item_dump_generator.py` 커멘드를 통해 dump item generating을 할 수 있다.\n\n6. django 파일 빈번하게 바꾸면서 테스트할 꺼라면, django를 도커라이징에서 제외하고 사용하는 것을 추천 (기본 세팅)\n\n---\n\n## 👨🏽‍💻 Case Study\n\n### 1. 전체 프로젝트 도커라이징 및 다중 데이터베이스 활용하기\n- `config \u003e dbrouter.py` 부분과 `config \u003e settings \u003e local.py` 에서 Database setting 부분을 참조해 보자\n- model에 `app_lable` 을 붙이는 것과 migrate 진행시 database option을 주는 것\n\n#### 여기서 Kafka \u0026 Kafka connect - Debezium 활용\n- log-based CDC 환경 구성, 3대의 DB 복제 및 활용\n- Debezium 활용하며 추가 plugin을 위해 `debezium/debezium-connector-jdbc` 가 존재합니다.\n- 이를 바탕으로 아래 사진과 같이 세팅이 되어 있습니다. duplication set과 distributed DBMS 세팅을 하고 싶다면 아래 블로그 글을 꼭 확인해 주세요!\n- ***[카프카 클러스터와 파이썬 (2) - Debezium \u0026 Postgresql \u0026 Django, log based CDC 만들기 (source \u0026 sink connector)](https://velog.io/@qlgks1/%EC%B9%B4%ED%94%84%EC%B9%B4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EC%99%80-%ED%8C%8C%EC%9D%B4%EC%8D%AC-2-Debezium-Postgresql-Django-log-based-CDC-%EB%A7%8C%EB%93%A4%EA%B8%B0-source-sink-connector)***\n\n\u003cimg src=\"./imgs/img3.png\" alt=\"django db routing\" width=\"800\"\u003e\n\n\n- 만약 단일 DBMS와 다중 DB를 사용하고 싶다면, 그냥 `dbrouter.py` 사용하지 않거나 `DATABASE_ROUTERS` 값을 수정해 주세요!\n\n### 2. 모든 api는 unit test와 coverage와 함께 \u0026 github 의 action을 통해 django test build 해보기\n- https://github.com/snypy/snypy-backend/blob/master/.github/workflows/test.yml\n- model moking 하기, 특히 user model 과 같은 경우\n\n### 3. N:M 을 다루기\n- OrderRequest 에서 출발을 해서, 해당 유저가 구매요청(OrderRequest)에 해당하는 모든 item과 seller를 찾아보자\n- `OrderRequest 1\u003c-N OrderList N-\u003e1 item N-\u003e1 seller`\n\n### 4. admin을 admin 답게 커스텀하기\n- 기존에 있는 admin을 좀 더 admin이 활용할 수 있게 custom 하기, 아래 velog글들로 대체한다.\n- [Django admin custom (1) - 기본적인 admin form custom \u0026 simple custom template](https://velog.io/@qlgks1/Django-admin-custom)\n- [Django admin custom (2) - 장고도 UX 개선을 해야한다! custom list \u0026 detail view, custom field \u0026 filter 와 추가 라이브러리](https://velog.io/@qlgks1/Django-admin-custom-2-custom-list-detail-view-custom-field-action-inline-action-%EC%99%80-%EC%B6%94%EA%B0%80-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)\n- [Django admin custom (3) - 장고도 UX 개선을 해야한다! Action \u0026 In-line action, Excel import \u0026 export, Base Admin Model 과 추가 라이브러리](https://velog.io/@qlgks1/Django-admin-custom-3-%EC%9E%A5%EA%B3%A0%EB%8F%84-UX-%EA%B0%9C%EC%84%A0%EC%9D%84-%ED%95%B4%EC%95%BC%ED%95%9C%EB%8B%A4-Action-In-line-action-Excel-import-export-Base-Admin-Model-%EA%B3%BC-%EC%B6%94%EA%B0%80-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)\n\n### 5. Django middleware 만들기\n- `HttpRequest -\u003e HttpResponse` 이 처리 구간에서 time library의 `process_time_ns` 함수를 활용해서 응답 헤더에 추가해 보자.\n- `config \u003e custom_middleware.py` 를 확인해 보자.\n\n### 6. DRF response, request 커스텀 자유롭게 하기\n- test app (`django_all_about \u003e apis \u003e test \u003e ... `) 부분에서 urls, views, serializers 부분 참고\n  - 1:N 일때 1의 역참조 serializer, N의 정참조 serializer\n  - 기본 `serializers.Serializer` 의 custom file 만들기\n  - `serializers` 의 본질에 조금 더 다가서기, 어떻게 Response를 만드는가\n- [Django, DRF Serializers - serializer 파헤치기, 왜 serializer? response가 만들어지기 까지](https://velog.io/@qlgks1/Django-DRF-Serializers-serializer-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-%EC%99%9C-serializer-response%EA%B0%80-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%80%EA%B8%B0-%EA%B9%8C%EC%A7%80) 글과 함께 follow 해주시면 감사합니다.\n\n### 7. Django 최적화 하기\n- `django_optimization` 디렉토리로 application 분리되어 있다.\n- ***기본적으로 django을 사용하면서 접근해야하는 최적화 접근 관점***\n- query (orm level) \u0026 index \u0026 multi index \u0026 filter (where) 순서 \u0026 캐싱 \u0026 이중화 에 대한 내용을 다룬다.\n- 자세한 내용은 아래 블로그 글들로 대신한다.\n- []()\n\n### 8. redis + celery worker / celery beat \u0026 redis pub n sub 구조 활용하기\n- django -\u003e redis -\u003e celery beat / celery worker (if result) -\u003e redis\n- django -\u003e redis message queue (producing) \u003c- queue consumer action\n  - 여기서 message queue는 redis를 대체하여 여타 다른 메시징 큐를 사용해도 무방하다.\n- 위 2가지를 활용하기, 자세한 내용은 아래 블로그 글들로 대신한다.\n- [Django Celery - async worker celery \u0026 redis (message que) basic](https://velog.io/@qlgks1/Django-Celery-MQ-message-que)\n- [Django Redis - caching, scheduling (task), pub/sub message que](https://velog.io/@qlgks1/Django-Redis-caching-scheduling-task-messaging-celery-async-worker)\n\n### 9. Django \u0026 Celery stack 활용하기\n- 위에서 더 나아가 celery task에 더 집중한 활용 방법이다. 아래 두 글과 follow up한다면 분명 기본적인 활용에는 쉽게 파악가능할 것이다.\n- [Django Celery - 단점, Task \u0026 subTask \u0026 Signature 비동기 작업 다루기 with network I/O](https://velog.io/@qlgks1/Django-Celery-%EB%8B%A8%EC%A0%90-Task-subTask-Signature-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85-%EB%8B%A4%EB%A3%A8%EA%B8%B0-with-network-IO)\n- [Django Celery - Task 그룹 작업, 선후행 Chain, 일괄 처리 (배치) Group \u0026 Chord](https://velog.io/@qlgks1/Django-Celery-Task-%EA%B7%B8%EB%A3%B9-%EC%9E%91%EC%97%85-%EC%84%A0%ED%9B%84%ED%96%89-Chain-%EC%9D%BC%EA%B4%84-%EC%B2%98%EB%A6%AC-%EB%B0%B0%EC%B9%98-Group-Chord)\n\n### 10. Server log 수집 \u0026 전체 서버 stack 모니터링 / Prometheus + Grafana (loki, promtail)\n- celery를 위한 flower, 그리고 그 metric 정보를 수집할 prometheus, 그 데이터를 시계열 시각화 해주는 grafana\n- log를 수집하는 agent promtail, 그리고 log를 알맞게 (특화된) 저장하고 검색에 특화된 loki, 그 데이터를 시계열 시각화 해주는 grafana\n- docker compose 를 통해 Up 해도 grafana dashboard 세팅은 직접하는게 좋다. 아래글을 꼭 참조하자!\n- [Django Celery - 효과적인 디버깅 \u0026 모니터링: Logging + Flower + Prometheus + Grafana(with Loki \u0026 Promtail)](https://velog.io/@qlgks1/Django-Celery-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9D%B8-%EB%94%94%EB%B2%84%EA%B9%85-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-Logging-Flower-Prometheus-Grafanawith-Loki-Promtail)\n\n### 11. 다양한 곳에서 볼 수 있는 cache 활용하기\n- `crawl_dev_quotes_batch` 함수에서 celery periodic task 를 활용해 cache를 update한다.\n  - `get_dev_quote` 에서 cached 된 data를 simple하게 어떻게 API로 만드는지 볼 수 있다.\n\n### 12. Kafka cluster with Python \u0026 Django\n- `docker \u003e kafka-cluster-compose.yml` 의 컴포즈 파일 기반으로 zookeeper 3 - kafka 3의 형태로 clustering된 kafka node 실행\n- 실행파일은 `docker \u003e kafka-docker-start.sh`, 쉘파일 존재, 해당 디렉토리로 가서 `source kafka-docker-start.sh` 로 바로 실행 가능\n- [카프카 클러스터와 파이썬](https://velog.io/@qlgks1/%EC%B9%B4%ED%94%84%EC%B9%B4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EC%99%80-%ED%8C%8C%EC%9D%B4%EC%8D%AC) 글을 참조하시면 좋습니다!\n\n---\n\n\n[![Hits Graphs](https://hits.seeyoufarm.com/api/count/graph/dailyhits.svg?url=https%3A%2F%2Fgithub.com%2FNuung%2Fdjango-all-about)](https://hits.seeyoufarm.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuung%2Fdjango-all-about","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnuung%2Fdjango-all-about","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuung%2Fdjango-all-about/lists"}