Artisan CLI Guide - bpmbox/fastapi_django_main_lives GitHub Wiki

🎨 Artisan CLI ツール完全ガイド

🎯 Artisan とは?

Artisan は、Laravel Framework で愛用される強力なコマンドラインツールのPython版実装です。開発効率を劇的に向上させる多彩なコマンドを提供します。

🚀 基本的な使用方法

📋 利用可能コマンド一覧

# Artisan のヘルプ表示
./artisan --help

# 利用可能なコマンド一覧
./artisan list

🏗️ 生成系コマンド (make:*)

📄 コントローラー作成

# 基本的なコントローラー作成
./artisan make:controller UserController

# RESTfulリソースコントローラー作成
./artisan make:controller BlogController --resource

# API専用コントローラー作成
./artisan make:controller ApiController --api

生成されるファイル例:

# app/Http/Controllers/UserController.py
"""
UserController
==============

Generated by Artisan on 2025-06-14 12:34:56
"""

from fastapi import APIRouter, Request, HTTPException
from typing import Dict, Any

router = APIRouter()

class UserController:
    """
    UserController
    
    Handle HTTP requests for user related operations
    """
    
    def index(self, request: Request) -> Dict[str, Any]:
        """Display a listing of users"""
        return {"users": []}
    
    def store(self, request: Request) -> Dict[str, Any]:
        """Store a newly created user"""
        pass
    
    def show(self, request: Request, id: int) -> Dict[str, Any]:
        """Display the specified user"""
        pass
    
    def update(self, request: Request, id: int) -> Dict[str, Any]:
        """Update the specified user"""
        pass
    
    def destroy(self, request: Request, id: int) -> Dict[str, Any]:
        """Remove the specified user"""
        pass

# FastAPI ルーター設定
@router.get("/users")
async def users_index(request: Request):
    return UserController().index(request)

@router.post("/users")
async def users_store(request: Request):
    return UserController().store(request)

@router.get("/users/{id}")
async def users_show(request: Request, id: int):
    return UserController().show(request, id)

@router.put("/users/{id}")
async def users_update(request: Request, id: int):
    return UserController().update(request, id)

@router.delete("/users/{id}")
async def users_destroy(request: Request, id: int):
    return UserController().destroy(request, id)

🎨 Gradio インターフェース作成

# Gradio UI作成
./artisan make:gradio ChatInterface

# AI機能付きインターフェース
./artisan make:gradio ImageAnalyzer --ai

生成されるファイル例:

# controllers/chat_interface/gradio_interface
"""
ChatInterface Gradio UI
=======================

Generated by Artisan on 2025-06-14 12:34:56
"""

import gradio as gr
from typing import Any

def create_chat_interface():
    """ChatInterface Gradio インターフェース作成"""
    
    with gr.Blocks(title="Chat Interface") as interface:
        gr.Markdown("# 💬 Chat Interface")
        
        with gr.Row():
            with gr.Column():
                input_text = gr.Textbox(
                    label="メッセージを入力",
                    placeholder="何か話しかけてください..."
                )
                submit_btn = gr.Button("送信", variant="primary")
            
            with gr.Column():
                output_text = gr.Textbox(
                    label="応答",
                    interactive=False
                )
        
        def process_message(message: str) -> str:
            """メッセージ処理(ここに実際の処理を実装)"""
            return f"受信: {message}"
        
        submit_btn.click(
            fn=process_message,
            inputs=[input_text],
            outputs=[output_text]
        )
    
    return interface

# 自動統合のため、この名前の関数を定義
gradio_interface = create_chat_interface()

🗄️ モデル作成

# データモデル作成
./artisan make:model User

# マイグレーション付きモデル作成
./artisan make:model Blog --migration

# 完全なCRUD機能付き
./artisan make:model Product --all

生成されるファイル例:

# app/Models/User.py
"""
User Model
==========

Generated by Artisan on 2025-06-14 12:34:56
"""

from django.db import models
from datetime import datetime

class User(models.Model):
    """User データモデル"""
    
    # フィールド定義
    name = models.CharField(max_length=100, verbose_name="名前")
    email = models.EmailField(unique=True, verbose_name="メールアドレス")
    password = models.CharField(max_length=255, verbose_name="パスワード")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="作成日時")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新日時")
    
    class Meta:
        db_table = 'users'
        verbose_name = 'ユーザー'
        verbose_name_plural = 'ユーザー'
    
    def __str__(self):
        return self.name
    
    # Laravel風 Eloquent ライクなメソッド
    @classmethod
    def where(cls, **kwargs):
        """条件検索(Laravel風)"""
        return cls.objects.filter(**kwargs)
    
    @classmethod
    def create(cls, **kwargs):
        """新規作成(Laravel風)"""
        return cls.objects.create(**kwargs)
    
    def update_attributes(self, **kwargs):
        """属性更新(Laravel風)"""
        for key, value in kwargs.items():
            setattr(self, key, value)
        self.save()
        return self

🔄 マイグレーション作成

# マイグレーション作成
./artisan make:migration create_users_table

# テーブル変更用マイグレーション
./artisan make:migration add_column_to_users_table --table=users

🖥️ サーバー・環境コマンド

🚀 開発サーバー起動

# 開発サーバー起動
./artisan serve

# ポート指定で起動
./artisan serve --port=8080

# ホスト指定で起動
./artisan serve --host=0.0.0.0 --port=8000

# デバッグモードで起動
./artisan serve --debug

🔧 環境管理

# 環境確認
./artisan env

# キャッシュクリア
./artisan cache:clear

# ログクリア
./artisan logs:clear

# 依存関係インストール
./artisan install

# アプリケーション初期化
./artisan fresh

🗄️ データベースコマンド

📊 マイグレーション実行

# マイグレーション実行
./artisan migrate

# マイグレーション状態確認
./artisan migrate:status

# マイグレーションロールバック
./artisan migrate:rollback

# データベースリセット
./artisan migrate:reset

# データベース再構築
./artisan migrate:fresh

🌱 シーダー(初期データ)

# シーダー作成
./artisan make:seeder UserSeeder

# シーダー実行
./artisan db:seed

# 特定のシーダー実行
./artisan db:seed --class=UserSeeder

🧪 開発・テストコマンド

🔍 インタラクティブシェル

# Python対話シェル起動(Laravel tinker相当)
./artisan tinker

# Django シェル起動
./artisan shell

# IPython シェル起動
./artisan ipython

✅ テスト実行

# テスト実行
./artisan test

# 特定のテストファイル実行
./artisan test tests/test_user.py

# カバレッジ付きテスト
./artisan test --coverage

🔧 カスタムコマンド作成

📝 新しいコマンドの追加

# artisan ファイル内にコマンド追加例

class CustomCommand(ArtisanCommand):
    """カスタムコマンドの実装例"""
    
    def handle(self, *args, **kwargs):
        """カスタム処理の実装"""
        print("🚀 カスタムコマンドが実行されました!")
        
        # 実際の処理をここに実装
        self.process_data()
        
        print("✅ 処理が完了しました")
    
    def process_data(self):
        """具体的な処理"""
        # データ処理ロジック
        pass

# コマンド登録
def register_commands():
    commands = {
        'custom': CustomCommand,
        'make:controller': MakeControllerCommand,
        'make:gradio': MakeGradioCommand,
        'make:model': MakeModelCommand,
        'serve': ServeCommand,
        'migrate': MigrateCommand,
        'tinker': TinkerCommand,
    }
    return commands

🎯 実践的な使用例

📝 ブログシステム作成例

# 1. ブログモデル作成
./artisan make:model Blog --migration

# 2. ブログコントローラー作成
./artisan make:controller BlogController --resource

# 3. Gradio管理画面作成
./artisan make:gradio BlogAdmin

# 4. マイグレーション実行
./artisan migrate

# 5. 初期データ投入
./artisan make:seeder BlogSeeder
./artisan db:seed --class=BlogSeeder

# 6. サーバー起動
./artisan serve

🤖 AI機能統合例

# 1. AI画像分析機能作成
./artisan make:gradio ImageAnalyzer --ai

# 2. AI APIコントローラー作成
./artisan make:controller AIController --api

# 3. 画像処理サービス作成
./artisan make:service ImageProcessingService

# 4. テスト作成
./artisan make:test ImageAnalyzerTest

# 5. テスト実行
./artisan test tests/test_image_analyzer.py

🏆 Artisan の強力な機能

⚡ 自動統合システム

  • controllers/ 配下に配置されたファイルを自動検出
  • gradio_interface 関数があれば自動統合
  • router オブジェクトがあれば自動ルーティング

🎨 Laravel風命名規則

  • RESTful規則: index, create, store, show, edit, update, destroy
  • ファイル命名: PascalCase コントローラー、snake_case ファイル
  • ディレクトリ構造: app/Http/Controllers/, database/migrations/

🔄 開発フロー最適化

  1. 設計: ./artisan make:model でデータ構造定義
  2. 実装: ./artisan make:controller でビジネスロジック
  3. UI作成: ./artisan make:gradio でインターフェース
  4. テスト: ./artisan make:test でテスト作成
  5. 実行: ./artisan serve で即座に確認

🚀 今後の拡張予定

🔮 計画中の新機能

  • ./artisan make:api - OpenAPI仕様自動生成
  • ./artisan make:component - 再利用可能UIコンポーネント
  • ./artisan deploy - 本番環境デプロイ自動化
  • ./artisan backup - データベース・ファイルバックアップ
  • ./artisan optimize - パフォーマンス最適化

Artisan を使用することで、Laravel の優れた開発体験をPython プロジェクトで実現できます。効率的で直感的な開発フローをお楽しみください! 🚀