ホームページ >バックエンド開発 >Python チュートリアル >Flask と MySQL を使用したタスク マネージャー アプリ
このプロジェクトは、Flask と MySQL で構築された タスク マネージャー アプリ です。タスクを管理するためのシンプルな RESTful API を提供し、基本的な CRUD (作成、読み取り、削除) 操作を示します。
このアプリケーションは、Flask アプリケーションを Docker を使用してコンテナ化し、MySQL データベースに接続する方法を理解するのに最適です。
from flask import Flask, request, jsonify import mysql.connector from mysql.connector import Error app = Flask(__name__) # Database connection function def get_db_connection(): try: connection = mysql.connector.connect( host="db", user="root", password="example", database="task_db" ) return connection except Error as e: return str(e) # Route for the home page @app.route('/') def home(): return "Welcome to the Task Management API! Use /tasks to interact with tasks." # Route to create a new task @app.route('/tasks', methods=['POST']) def add_task(): task_description = request.json.get('description') if not task_description: return jsonify({"error": "Task description is required"}), 400 connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("INSERT INTO tasks (description) VALUES (%s)", (task_description,)) connection.commit() task_id = cursor.lastrowid cursor.close() connection.close() return jsonify({"message": "Task added successfully", "task_id": task_id}), 201 # Route to get all tasks @app.route('/tasks', methods=['GET']) def get_tasks(): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("SELECT id, description FROM tasks") tasks = cursor.fetchall() cursor.close() connection.close() task_list = [{"id": task[0], "description": task[1]} for task in tasks] return jsonify(task_list), 200 # Route to delete a task by ID @app.route('/tasks/<int:task_id>', methods=['DELETE']) def delete_task(task_id): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("DELETE FROM tasks WHERE id = %s", (task_id,)) connection.commit() cursor.close() connection.close() return jsonify({"message": "Task deleted successfully"}), 200 if __name__ == "__main__": app.run(host='0.0.0.0')
init-db.sql という名前の MySQL スクリプトを作成して、データベースとタスク テーブルを設定します。
init-db.sql スクリプトを作成するには、次の手順に従います。
プロジェクト ディレクトリに新しい ファイルを作成します:
プロジェクト フォルダーに移動し、init-db.sql
という名前の新しいファイルを作成します。
SQL コマンドを追加して、データベースとタスク テーブルを設定します:
テキスト エディタで init-db.sql を開き、次の SQL コマンドを追加します。
CREATE DATABASE IF NOT EXISTS task_db; USE task_db; CREATE TABLE IF NOT EXISTS tasks ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(255) NOT NULL );
docker-compose.yml が配置されているプロジェクト フォルダーに、ファイルを init-db.sql として保存しました。 .
docker-compose.yml 内:
docker-compose.yml ファイルには、このスクリプトを指すボリューム構成があります。
以下は docker-compose.yml ファイルです
docker-compose.yml:
version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: task_db ports: - "3306:3306" volumes: - db_data:/var/lib/mysql - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql web: build: . ports: - "5000:5000" depends_on: - db environment: FLASK_ENV: development volumes: - .:/app volumes: db_data:
この構成により、MySQL コンテナの起動時に init-db.sql スクリプトが実行されて、task_db データベースを作成し、tasks テーブルを作成します。
注: docker-entrypoint-initdb.d/ ディレクトリは、MySQL コンテナによって使用されます。 🎜>.sql コンテナーの初回起動時のスクリプト。
説明:1. version: '3': 使用されている Docker Compose のバージョンを指定します。
2.サービス:
ウェブ:
from flask import Flask, request, jsonify import mysql.connector from mysql.connector import Error app = Flask(__name__) # Database connection function def get_db_connection(): try: connection = mysql.connector.connect( host="db", user="root", password="example", database="task_db" ) return connection except Error as e: return str(e) # Route for the home page @app.route('/') def home(): return "Welcome to the Task Management API! Use /tasks to interact with tasks." # Route to create a new task @app.route('/tasks', methods=['POST']) def add_task(): task_description = request.json.get('description') if not task_description: return jsonify({"error": "Task description is required"}), 400 connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("INSERT INTO tasks (description) VALUES (%s)", (task_description,)) connection.commit() task_id = cursor.lastrowid cursor.close() connection.close() return jsonify({"message": "Task added successfully", "task_id": task_id}), 201 # Route to get all tasks @app.route('/tasks', methods=['GET']) def get_tasks(): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("SELECT id, description FROM tasks") tasks = cursor.fetchall() cursor.close() connection.close() task_list = [{"id": task[0], "description": task[1]} for task in tasks] return jsonify(task_list), 200 # Route to delete a task by ID @app.route('/tasks/<int:task_id>', methods=['DELETE']) def delete_task(task_id): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("DELETE FROM tasks WHERE id = %s", (task_id,)) connection.commit() cursor.close() connection.close() return jsonify({"message": "Task deleted successfully"}), 200 if __name__ == "__main__": app.run(host='0.0.0.0')この Dockerfile は、Flask アプリ用の軽量 Python 環境をセットアップします。
1.ベースイメージ: 最小限の Python ランタイムに python:3.9-slim を使用します。
作業ディレクトリ: /app を作業ディレクトリとして設定します。
2.依存関係:requirements.txt をコピーし、pip 経由で依存関係をインストールします。
3.ツールのインストール: サービスの準備状況を確認するために wait-for-it をインストールします。
4.アプリケーション コード: すべてのアプリ コードをコンテナーにコピーします。
5.起動コマンド: app.py を起動する前に wait-for-it を実行して、MySQL DB (db:3306) の準備が整っていることを確認します。
この requirements.txt は、Python プロジェクトが Web アプリケーションの構築に Flask フレームワーク と mysql-connector-python を必要とすることを指定します。 との接続と対話用MySQL データベース。これらのパッケージは、イメージのビルド プロセス中に pip install -r required.txt が実行されるときに、Docker コンテナー内にインストールされます。これにより、Flask サーバー を実行し、MySQL データベース と通信するために必要なツールがアプリに確実に備わります。
from flask import Flask, request, jsonify import mysql.connector from mysql.connector import Error app = Flask(__name__) # Database connection function def get_db_connection(): try: connection = mysql.connector.connect( host="db", user="root", password="example", database="task_db" ) return connection except Error as e: return str(e) # Route for the home page @app.route('/') def home(): return "Welcome to the Task Management API! Use /tasks to interact with tasks." # Route to create a new task @app.route('/tasks', methods=['POST']) def add_task(): task_description = request.json.get('description') if not task_description: return jsonify({"error": "Task description is required"}), 400 connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("INSERT INTO tasks (description) VALUES (%s)", (task_description,)) connection.commit() task_id = cursor.lastrowid cursor.close() connection.close() return jsonify({"message": "Task added successfully", "task_id": task_id}), 201 # Route to get all tasks @app.route('/tasks', methods=['GET']) def get_tasks(): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("SELECT id, description FROM tasks") tasks = cursor.fetchall() cursor.close() connection.close() task_list = [{"id": task[0], "description": task[1]} for task in tasks] return jsonify(task_list), 200 # Route to delete a task by ID @app.route('/tasks/<int:task_id>', methods=['DELETE']) def delete_task(task_id): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("DELETE FROM tasks WHERE id = %s", (task_id,)) connection.commit() cursor.close() connection.close() return jsonify({"message": "Task deleted successfully"}), 200 if __name__ == "__main__": app.run(host='0.0.0.0')
すべてのファイルを作成したら、次のステップはサービスを構築して実行することです。サービスの構築と実行には次のコマンドが使用されます。
CREATE DATABASE IF NOT EXISTS task_db; USE task_db; CREATE TABLE IF NOT EXISTS tasks ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(255) NOT NULL );
サービスをデタッチモードで実行するには、docker-compose up
の代わりに次のコマンドを使用しました。
version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: task_db ports: - "3306:3306" volumes: - db_data:/var/lib/mysql - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql web: build: . ports: - "5000:5000" depends_on: - db environment: FLASK_ENV: development volumes: - .:/app volumes: db_data:
サービスを停止したい場合は、次のコマンドを使用します
FROM python:3.9-slim WORKDIR /app # Install dependencies COPY requirements.txt . RUN pip install -r requirements.txt # Install wait-for-it tool# RUN apt-get update && apt-get install -y wait-for-it #Copy the application code> COPY . . # Use wait-for-it to wait for DB and start the Flask app CMD ["wait-for-it", "db:3306", "--", "python", "app.py"]
サービスが実行状態になったら、コマンドを実行します
Flask mysql-connector-python
コンテナが実行されていることを確認するため
次に、サービス API をチェックして、期待どおりに動作していることを確認します。
http://localhost:5000/ でアプリにアクセスします。
下の画像に示すように、上記のコマンドを実行すると、ブラウザーでアプリにアクセスできました。
Postman または Curl を使用して、POST、GET、および DELETE 操作の /tasks エンドポイントをテストできます。この場合、curl を使用します。
GET メソッドはすべてのタスクを取得します。
docker-compose build docker-compose up
ブラウザで http://localhost:5000/tasks を実行すると、タスクの追加で説明したように、追加したすべてのタスクが表示されることに注意してください。
POST メソッドはデータベース内にタスクを作成します。
docker-compose up -d
これにより、タスクの説明を含む POST リクエストが Flask アプリに送信されます。タスクが正常に追加されると、次のような応答を受け取るはずです:
docker-compose down
ブラウザのネットワーク タブまたはログをチェックして、POST リクエストが正しく行われていることを確認してください。
コマンドを数回実行し、「Simple Task」と表示されている部分をカスタマイズして、さまざまな出力を生成しました。実行したコマンドは次のとおりです。出力は以下の画像で確認できます。
docker ps
from flask import Flask, request, jsonify import mysql.connector from mysql.connector import Error app = Flask(__name__) # Database connection function def get_db_connection(): try: connection = mysql.connector.connect( host="db", user="root", password="example", database="task_db" ) return connection except Error as e: return str(e) # Route for the home page @app.route('/') def home(): return "Welcome to the Task Management API! Use /tasks to interact with tasks." # Route to create a new task @app.route('/tasks', methods=['POST']) def add_task(): task_description = request.json.get('description') if not task_description: return jsonify({"error": "Task description is required"}), 400 connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("INSERT INTO tasks (description) VALUES (%s)", (task_description,)) connection.commit() task_id = cursor.lastrowid cursor.close() connection.close() return jsonify({"message": "Task added successfully", "task_id": task_id}), 201 # Route to get all tasks @app.route('/tasks', methods=['GET']) def get_tasks(): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("SELECT id, description FROM tasks") tasks = cursor.fetchall() cursor.close() connection.close() task_list = [{"id": task[0], "description": task[1]} for task in tasks] return jsonify(task_list), 200 # Route to delete a task by ID @app.route('/tasks/<int:task_id>', methods=['DELETE']) def delete_task(task_id): connection = get_db_connection() if isinstance(connection, str): # If connection fails return jsonify({"error": connection}), 500 cursor = connection.cursor() cursor.execute("DELETE FROM tasks WHERE id = %s", (task_id,)) connection.commit() cursor.close() connection.close() return jsonify({"message": "Task deleted successfully"}), 200 if __name__ == "__main__": app.run(host='0.0.0.0')
CREATE DATABASE IF NOT EXISTS task_db; USE task_db; CREATE TABLE IF NOT EXISTS tasks ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(255) NOT NULL );
DELETE メソッドは ID によってタスクを削除します。
version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: task_db ports: - "3306:3306" volumes: - db_data:/var/lib/mysql - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql web: build: . ports: - "5000:5000" depends_on: - db environment: FLASK_ENV: development volumes: - .:/app volumes: db_data:
以下のコマンドを実行して、ID:4 のタスクを削除しました。下の画像に示すように、タスク 4 が削除されました。
FROM python:3.9-slim WORKDIR /app # Install dependencies COPY requirements.txt . RUN pip install -r requirements.txt # Install wait-for-it tool# RUN apt-get update && apt-get install -y wait-for-it #Copy the application code> COPY . . # Use wait-for-it to wait for DB and start the Flask app CMD ["wait-for-it", "db:3306", "--", "python", "app.py"]
Flask と MySQL を使用してタスク マネージャー アプリを作成することは、Web サービス開発、データベース統合、Docker によるコンテナ化の基礎を理解するための優れた方法です。
このプロジェクトは、Web サーバーとデータベースが連携してシームレスな機能を提供する方法をカプセル化しています。
この学習経験を活用し、より深い Web およびクラウドベースの開発プロジェクトへの足がかりとして使用してください。
以上がFlask と MySQL を使用したタスク マネージャー アプリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。