本專案為 OJ (Online Judge) 後端系統,使用 Django + Django REST Framework 實作。請依照本文指引統一開發流程與環境。
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activatepip install -r requirements.txt每次更新資料表時都要進行。
python manage.py makemigrations
python manage.py migrate請複製 .env.example 為 .env,並依需求調整:
# Django 基本設定
DJANGO_DEBUG=True
DJANGO_SECRET_KEY=dev-secret
ALLOWED_HOSTS=127.0.0.1,localhost
DB_ENGINE=sqlite
CORS_ALLOWED_ORIGINS=http://localhost:5173
CSRF_TRUSTED_ORIGINS=http://localhost:5173
# Celery 設定
CELERY_BROKER_URL=redis://127.0.0.1:6379/0
CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
# Sandbox API 設定
SANDBOX_API_URL=http://34.81.90.111:8000
SANDBOX_TIMEOUT=30
SANDBOX_API_KEY=happylittle7Django 基本設定:
DJANGO_DEBUG: 開發模式開關,正式環境須設為FalseDJANGO_SECRET_KEY: Django 加密金鑰,請參考下方「如何產生 DJANGO_SECRET_KEY」ALLOWED_HOSTS: 允許的主機名稱,多個用逗號分隔DB_ENGINE: 資料庫引擎,開發用sqlite,正式環境用postgresqlCORS_ALLOWED_ORIGINS: CORS 允許的來源,前端位址CSRF_TRUSTED_ORIGINS: CSRF 信任的來源 (如用 Session Auth)
Celery 設定:
CELERY_BROKER_URL: Celery 訊息佇列位址,使用 Redis database 0CELERY_RESULT_BACKEND: Celery 結果儲存位址,使用 Redis database 0
Sandbox API 設定:
SANDBOX_API_URL: Sandbox 判題系統 API 位址SANDBOX_TIMEOUT: API 請求超時時間(秒)SANDBOX_API_KEY: Sandbox API 認證金鑰BACKEND_BASE_URL= Backend 公開網址(用於 Sandbox callback)
- SQLite 用於本機測試;正式環境將改為 PostgreSQL
- 請勿將
.env提交到 Git,已加入.gitignore
本專案需要以下服務同時運行,建議開啟 4 個終端視窗分別執行:
Redis 用於 Celery 的訊息佇列和結果儲存。
# 確保 Docker Desktop 已啟動(看到頂部選單欄的 Docker 圖示)
# 啟動 Redis 容器
docker-compose -f docker-compose.redis.yml up -d
# 檢查 Redis 是否運行
docker ps | grep redis# macOS 使用 Homebrew
brew install redis
brew services start redis
# 或手動啟動
redis-server驗證 Redis 是否運行:
redis-cli ping
# 應該回傳: PONGCelery 用於處理非同步任務(如提交判題、郵件發送等)。
# 確保已啟動 Redis
# 啟動 Celery Worker
celery -A back_end worker -l info
# 看到以下訊息表示成功:
# [tasks]
# . submissions.tasks.submit_to_sandbox_task
# . submissions.tasks.submit_selftest_to_sandbox_task注意事項:
- Celery Worker 不會自動重新載入程式碼
- 修改
tasks.py或相關程式碼後,需要重啟 Celery Worker - 使用
Ctrl+C停止,然後重新啟動
python manage.py runserverDjango 會在 http://localhost:8000 啟動。
API 文件:
- Swagger UI:
http://localhost:8000/api/schema/swagger-ui/ - ReDoc:
http://localhost:8000/api/schema/redoc/
保留一個終端用於執行測試、資料庫操作等。
# 執行測試
pytest
# 建立超級使用者
python manage.py createsuperuser
# 進入 Django Shell
python manage.py shell開發前請確認以下服務都已啟動:
- Docker Desktop 已開啟(如果使用 Docker 版 Redis)
- Redis 正在運行
redis-cli ping # 應回傳 PONG - Celery Worker 正在運行
# 檢查終端是否顯示 "celery@... ready." - Django Server 正在運行
curl http://localhost:8000/api/ # 應回傳 API 資訊
A:
- 確認 Redis 是否啟動:
docker ps | grep redis或redis-cli ping - 檢查
.env中的CELERY_BROKER_URL設定是否正確 - 如果使用 Docker,確保 Docker Desktop 已啟動
A:
- 確認 Redis 已啟動
- 檢查
celery -A back_end worker -l info啟動日誌中是否有顯示任務列表 - 修改程式碼後需要重啟 Celery Worker
A:
- 確認已執行
python manage.py migrate - 檢查
.env檔案是否存在且設定正確 - 確認虛擬環境已啟動
A:
- 手動開啟 Docker Desktop 應用程式
- 等待 Docker 圖示出現在頂部選單欄且停止轉動
- 執行
docker info確認 Docker 已啟動
-
main:正式環境分支(最終 Demo 使用),僅組長/PM 可 merge。
-
dev:開發主要分支,所有功能分支須合併回 dev。
-
feature branches:每位開發者從
dev開新分支,例如:feat/users-authfix/submissions-bug
合併流程:
- 從
dev建立分支並開發。 - 開發完成 → 提交 PR → Code Review。
- 經組長審核後 merge 回 dev(在 DC @ 組長)。
- 確認穩定後,由組長/PM merge dev → main。
格式:
type: subject
- feat: 新增/修改功能。
- fix: 修補 bug。
- docs: 文件或註解。
- refactor: 重構(不影響功能)。
- chore: 環境設定(例如 requirements.txt 變更)。
feat: add login backend support
fix: correct submission serializer bug
docs: update API usage in README
refactor: simplify course query logic
chore: update Django version to 5.0.1建議 commit 切細,處理完一個段落就提交一次。
本專案使用 Python 虛擬環境。
統一依賴請更新 requirements.txt:
pip freeze > requirements.txt其他人只需:
pip install -r requirements.txt即可同步環境。
users/– 使用者管理與權限auths/– 認證與安全courses/– 課程與成員管理problems/– 題目管理assignments/– 作業系統submissions/– 提交與評測
- 從
dev建立新 branch。 - 完成功能後切細 commit。
- 發 PR → Review → Merge 回 dev。
- 由組長/PM 決定何時 merge dev → main。
- 資料庫在開發測試階段使用 SQLite;部署時會切換到 PostgreSQL。
.venv/已加入.gitignore,請勿提交虛擬環境檔案。- 如需測試種子資料,請使用
fixtures/並透過loaddata匯入。
請在本機
.env產生並填入,不要把.env提交到 Git。
python -c "from django.core.management.utils import get_random_secret_key as g; print(g())"把輸出貼到 .env:
DJANGO_SECRET_KEY= <貼上剛剛那串>python -c "import secrets,string; print(''.join(secrets.choice(string.ascii_letters+string.digits+'!@#$%^&*(-_=+)') for _ in range(64)))"openssl rand -base64 48[Convert]::ToBase64String((New-Object Byte[] 48 | %{$_=0}; [Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($args[0]); $args[0]))SECRET_KEY長度建議 50+,來源需隨機;請放入本機.env。- 不要把正式環境的
SECRET_KEY放進 repo;請用部署平台的 Secrets / 環境變數管理。 - 更換正式環境
SECRET_KEY後既有 Django session/CSRF 會失效,使用者需重新登入。