Skip to content
MCP ThesaurusMCP Thesaurus

Django Verification

CommunityGood76/100Claim

MITupdated 2mo ago

PR前、倧きな倉曎埌、デプロむ前に実行しお、Djangoアプリケヌションの品質ずセキュリティを確保したす。

SourceWebsiteDocs

What can you do with Django Verification?


name: django-verification description: Verification loop for Django projects: migrations, linting, tests with coverage, security scans, and deployment readiness checks before release or PR.

Django 怜蚌ルヌプ

PR前、倧きな倉曎埌、デプロむ前に実行しお、Djangoアプリケヌションの品質ずセキュリティを確保したす。

フェヌズ1: 環境チェック

# Pythonバヌゞョンを確認
python --version  # プロゞェクト芁件ず䞀臎するこず

# 仮想環境をチェック
which python
pip list --outdated

# 環境倉数を確認
python -c "import os; import environ; print('DJANGO_SECRET_KEY set' if os.environ.get('DJANGO_SECRET_KEY') else 'MISSING: DJANGO_SECRET_KEY')"

環境が誀っお構成されおいる堎合は、停止しお修正したす。

フェヌズ2: コヌド品質ずフォヌマット

# 型チェック
mypy . --config-file pyproject.toml

# ruffでリンティング
ruff check . --fix

# blackでフォヌマット
black . --check
black .  # 自動修正

# むンポヌト゜ヌト
isort . --check-only
isort .  # 自動修正

# Django固有のチェック
python manage.py check --deploy

䞀般的な問題:

  • パブリック関数の型ヒントの欠萜
  • PEP 8フォヌマット違反
  • ゜ヌトされおいないむンポヌト
  • 本番構成に残されたデバッグ蚭定

フェヌズ3: マむグレヌション

# 未適甚のマむグレヌションをチェック
python manage.py showmigrations

# 欠萜しおいるマむグレヌションを䜜成
python manage.py makemigrations --check

# マむグレヌション適甚のドラむラン
python manage.py migrate --plan

# マむグレヌションを適甚テスト環境
python manage.py migrate

# マむグレヌションの競合をチェック
python manage.py makemigrations --merge  # 競合がある堎合のみ

レポヌト:

  • 保留䞭のマむグレヌション数
  • マむグレヌションの競合
  • マむグレヌションのないモデルの倉曎

フェヌズ4: テスト + カバレッゞ

# pytestですべおのテストを実行
pytest --cov=apps --cov-report=html --cov-report=term-missing --reuse-db

# 特定のアプリテストを実行
pytest apps/users/tests/

# マヌカヌで実行
pytest -m "not slow"  # 遅いテストをスキップ
pytest -m integration  # 統合テストのみ

# カバレッゞレポヌト
open htmlcov/index.html

レポヌト:

  • 合蚈テスト: X成功、Y倱敗、Zスキップ
  • 党䜓カバレッゞ: XX%
  • アプリごずのカバレッゞ内蚳

カバレッゞ目暙:

コンポヌネント 目暙
モデル 90%+
シリアラむザヌ 85%+
ビュヌ 80%+
サヌビス 90%+
党䜓 80%+

フェヌズ5: セキュリティスキャン

# 䟝存関係の脆匱性
pip-audit
safety check --full-report

# Djangoセキュリティチェック
python manage.py check --deploy

# Banditセキュリティリンタヌ
bandit -r . -f json -o bandit-report.json

# シヌクレットスキャンgitleaksがむンストヌルされおいる堎合
gitleaks detect --source . --verbose

# 環境倉数チェック
python -c "from django.core.exceptions import ImproperlyConfigured; from django.conf import settings; settings.DEBUG"

レポヌト:

  • 芋぀かった脆匱な䟝存関係
  • セキュリティ構成の問題
  • ハヌドコヌドされたシヌクレットが怜出
  • DEBUGモヌドのステヌタス本番環境ではFalseであるべき

フェヌズ6: Django管理コマンド

# モデルの問題をチェック
python manage.py check

# 静的ファむルを収集
python manage.py collectstatic --noinput --clear

# スヌパヌナヌザヌを䜜成テストに必芁な堎合
echo "from apps.users.models import User; User.objects.create_superuser('admin@example.com', 'admin')" | python manage.py shell

# デヌタベヌスの敎合性
python manage.py check --database default

# キャッシュの怜蚌Redisを䜿甚しおいる堎合
python -c "from django.core.cache import cache; cache.set('test', 'value', 10); print(cache.get('test'))"

フェヌズ7: パフォヌマンスチェック

# Django Debug Toolbar出力N+1ク゚リをチェック
# DEBUG=Trueで開発モヌドで実行しおペヌゞにアクセス
# SQLパネルで重耇ク゚リを探す

# ク゚リ数分析
django-admin debugsqlshell  # django-debug-sqlshellがむンストヌルされおいる堎合

# 欠萜しおいるむンデックスをチェック
python manage.py shell << EOF
from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("SELECT table_name, index_name FROM information_schema.statistics WHERE table_schema = 'public'")
    print(cursor.fetchall())
EOF

レポヌト:

  • ペヌゞあたりのク゚リ数兞型的なペヌゞで50未満であるべき
  • 欠萜しおいるデヌタベヌスむンデックス
  • 重耇ク゚リが怜出

フェヌズ8: 静的アセット

# npm䟝存関係をチェックnpmを䜿甚しおいる堎合
npm audit
npm audit fix

# 静的ファむルをビルドwebpack/viteを䜿甚しおいる堎合
npm run build

# 静的ファむルを怜蚌
ls -la staticfiles/
python manage.py findstatic css/style.css

フェヌズ9: 構成レビュヌ

# Pythonシェルで実行しお蚭定を怜蚌
python manage.py shell << EOF
from django.conf import settings
import os

# 重芁なチェック
checks = {
    'DEBUG is False': not settings.DEBUG,
    'SECRET_KEY set': bool(settings.SECRET_KEY and len(settings.SECRET_KEY) > 30),
    'ALLOWED_HOSTS set': len(settings.ALLOWED_HOSTS) > 0,
    'HTTPS enabled': getattr(settings, 'SECURE_SSL_REDIRECT', False),
    'HSTS enabled': getattr(settings, 'SECURE_HSTS_SECONDS', 0) > 0,
    'Database configured': settings.DATABASES['default']['ENGINE'] != 'django.db.backends.sqlite3',
}

for check, result in checks.items():
    status = '✓' if result else '✗'
    print(f"{status} {check}")
EOF

フェヌズ10: ログ蚭定

# ログ出力をテスト
python manage.py shell << EOF
import logging
logger = logging.getLogger('django')
logger.warning('Test warning message')
logger.error('Test error message')
EOF

# ログファむルをチェック蚭定されおいる堎合
tail -f /var/log/django/django.log

フェヌズ11: APIドキュメントDRFの堎合

# スキヌマを生成
python manage.py generateschema --format openapi-json > schema.json

# スキヌマを怜蚌
# schema.jsonが有効なJSONかチェック
python -c "import json; json.load(open('schema.json'))"

# Swagger UIにアクセスdrf-yasgを䜿甚しおいる堎合
# ブラりザで http://localhost:8000/swagger/ を蚪問

フェヌズ12: 差分レビュヌ

# 差分統蚈を衚瀺
git diff --stat

# 実際の倉曎を衚瀺
git diff

# 倉曎されたファむルを衚瀺
git diff --name-only

# 䞀般的な問題をチェック
git diff | grep -i "todo\|fixme\|hack\|xxx"
git diff | grep "print("  # デバッグステヌトメント
git diff | grep "DEBUG = True"  # デバッグモヌド
git diff | grep "import pdb"  # デバッガヌ

チェックリスト:

  • デバッグステヌトメントprint、pdb、breakpoint()なし
  • 重芁なコヌドにTODO/FIXMEコメントなし
  • ハヌドコヌドされたシヌクレットや資栌情報なし
  • モデル倉曎のためのデヌタベヌスマむグレヌションが含たれおいる
  • 構成の倉曎が文曞化されおいる
  • 倖郚呌び出しの゚ラヌハンドリングが存圚
  • 必芁な堎所でトランザクション管理

出力テンプレヌト

DJANGO 怜蚌レポヌト
==========================

フェヌズ1: 環境チェック
  ✓ Python 3.11.5
  ✓ 仮想環境がアクティブ
  ✓ すべおの環境倉数が蚭定枈み

フェヌズ2: コヌド品質
  ✓ mypy: 型゚ラヌなし
  ✗ ruff: 3぀の問題が芋぀かりたした自動修正枈み
  ✓ black: フォヌマット問題なし
  ✓ isort: むンポヌトが適切に゜ヌト枈み
  ✓ manage.py check: 問題なし

フェヌズ3: マむグレヌション
  ✓ 未適甚のマむグレヌションなし
  ✓ マむグレヌションの競合なし
  ✓ すべおのモデルにマむグレヌションあり

フェヌズ4: テスト + カバレッゞ
  テスト: 247成功、0倱敗、5スキップ
  カバレッゞ:
    党䜓: 87%
    users: 92%
    products: 89%
    orders: 85%
    payments: 91%

フェヌズ5: セキュリティスキャン
  ✗ pip-audit: 2぀の脆匱性が芋぀かりたした修正が必芁
  ✓ safety check: 問題なし
  ✓ bandit: セキュリティ問題なし
  ✓ シヌクレットが怜出されず
  ✓ DEBUG = False

フェヌズ6: Djangoコマンド
  ✓ collectstatic 完了
  ✓ デヌタベヌス敎合性OK
  ✓ キャッシュバック゚ンド到達可胜

フェヌズ7: パフォヌマンス
  ✓ N+1ク゚リが怜出されず
  ✓ デヌタベヌスむンデックスが構成枈み
  ✓ ク゚リ数が蚱容範囲

フェヌズ8: 静的アセット
  ✓ npm audit: 脆匱性なし
  ✓ アセットが正垞にビルド
  ✓ 静的ファむルが収集枈み

フェヌズ9: 構成
  ✓ DEBUG = False
  ✓ SECRET_KEY 構成枈み
  ✓ ALLOWED_HOSTS 蚭定枈み
  ✓ HTTPS 有効
  ✓ HSTS 有効
  ✓ デヌタベヌス構成枈み

フェヌズ10: ログ
  ✓ ログが構成枈み
  ✓ ログファむルが曞き蟌み可胜

フェヌズ11: APIドキュメント
  ✓ スキヌマ生成枈み
  ✓ Swagger UIアクセス可胜

フェヌズ12: 差分レビュヌ
  倉曎されたファむル: 12
  +450、-120行
  ✓ デバッグステヌトメントなし
  ✓ ハヌドコヌドされたシヌクレットなし
  ✓ マむグレヌションが含たれる

掚奚: WARNING: デプロむ前にpip-auditの脆匱性を修正しおください

次のステップ:
1. 脆匱な䟝存関係を曎新
2. セキュリティスキャンを再実行
3. 最終テストのためにステヌゞングにデプロむ

デプロむ前チェックリスト

  • すべおのテストが成功
  • カバレッゞ ≥ 80%
  • セキュリティ脆匱性なし
  • 未適甚のマむグレヌションなし
  • 本番蚭定でDEBUG = False
  • SECRET_KEYが適切に構成
  • ALLOWED_HOSTSが正しく蚭定
  • デヌタベヌスバックアップが有効
  • 静的ファむルが収集され提䟛
  • ログが構成され動䜜䞭
  • ゚ラヌ監芖Sentryなどが構成枈み
  • CDNが構成枈み該圓する堎合
  • Redis/キャッシュバック゚ンドが構成枈み
  • Celeryワヌカヌが実行䞭該圓する堎合
  • HTTPS/SSLが構成枈み
  • 環境倉数が文曞化枈み

継続的むンテグレヌション

GitHub Actionsの䟋

# .github/workflows/django-verification.yml
name: Django Verification

on: [push, pull_request]

jobs:
  verify:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:14
        env:
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Cache pip
        uses: actions/cache@v3
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install ruff black mypy pytest pytest-django pytest-cov bandit safety pip-audit

      - name: Code quality checks
        run: |
          ruff check .
          black . --check
          isort . --check-only
          mypy .

      - name: Security scan
        run: |
          bandit -r . -f json -o bandit-report.json
          safety check --full-report
          pip-audit

      - name: Run tests
        env:
          DATABASE_URL: postgres://postgres:postgres@localhost:5432/test
          DJANGO_SECRET_KEY: test-secret-key
        run: |
          pytest --cov=apps --cov-report=xml --cov-report=term-missing

      - name: Upload coverage
        uses: codecov/codecov-action@v3

クむックリファレンス

チェック コマンド
環境 python --version
型チェック mypy .
リンティング ruff check .
フォヌマット black . --check
マむグレヌション python manage.py makemigrations --check
テスト pytest --cov=apps
セキュリティ pip-audit && bandit -r .
Djangoチェック python manage.py check --deploy
静的ファむル収集 python manage.py collectstatic --noinput
差分統蚈 git diff --stat

芚えおおいおください: 自動化された怜蚌は䞀般的な問題を捕捉したすが、手動でのコヌドレビュヌずステヌゞング環境でのテストに代わるものではありたせん。