PlayGroundAdventCalendar2024 10日目🎄
バックエンドコースのhanakaです。
先日参加したハッカソンにてFlaskとChatGPTのAPIを使ったシステムの開発に取り組んだので、その簡易版の手順と、簡単な説明を書いてみようと思います!
実際に作ったものの一部を取って来ているため、本題ではないフロントエンドも不必要に凝った書き方しています…すみません...。
はじめに
Flaskとは?
Flaskは、Pythonで作られた軽量でシンプルなWebフレームワークです。必要最低限の機能のみを備えた「マイクロフレームワーク」と呼ばれており、自由度が高く、拡張やカスタマイズが簡単です。
(確かにDjangoに慣れている私には、Flaskめちゃめちゃ書きやすかった…!)
直感的なコード構成で初心者にも扱いやすい一方、大規模開発では設計力が求められます。
これらの特徴から、主にシンプルなAPIの構築やプロトタイプ、中小規模のWebアプリ開発に適しています。
「外部APIを組み込む」とは?
外部APIを利用するとは、他のサービスやシステムが提供する機能やデータを、自分のアプリケーションから呼び出して利用することを指します。
API(Application Programming Interface)は、アプリケーション同士がやり取りするための窓口のようなものです。
例えば...
⛅ 天気予報アプリが、気象情報サービスのAPIを利用して最新の天気情報を取得
🌏 地図アプリがGoogle Maps APIを使って地図やルート案内を提供
などなど。
外部APIを利用する利点は以下の通りです。
- 開発の効率化
自分で機能を一から作らなくても、既存のサービスを利用することで開発時間を短縮できます。
- 高品質なデータ利用
専門サービスが提供する信頼性の高いデータや機能を使えます(例:決済、翻訳、AIモデルなど)。
- コスト削減
自分でインフラやデータの管理をしなくても済むため、コストを抑えられます。
- 最新の技術を活用可能
外部APIは頻繁にアップデートされるため、自分のアプリでも常に最新の機能を利用できます。
- スケーラビリティ
高トラフィックな機能(例:動画配信、画像処理)も、外部サービスに任せることで負荷を分散できます。
今回利用したChatGPT APIも、とても簡単に使うことができます!
- OpenAI APIキーを取得
OpenAIのAPIプラットフォームに登録
→ APIキーを発行(「API Keys」セクションから取得)
- 仮想環境にopenAIのパッケージをインストール
- Flaskアプリ内で呼び出す
かんたん!詳細は後述します。1だけ事前準備お願いします。
作ってみる
完成するものと全体像
今回は、
「フォームで入力した食べ物を用いて、おすすめのレシピを提案してくれるシステム」
を作ってみたいと思います!
完成イメージはこちら!デザインがとてもシンプルですが、悪しからず。
使用した技術は以下の通りです。
フロントエンド:React, Tailwind CSS, shad CN
バックエンド:Flask, ChatGPT API
どれも今回ほぼ初めて触った技術スタックで、様々な不備欠陥あると思いますが温かい目で見守ってやってください…。
手順の説明は、以下の階層構造を前提として進めていきます!
myapp
-frontend
- src
- components\ui (自動生成)
- button.tsx
- dialog.tsx
- pages
- Home.tsx
- List.tsx
- App.css
- App.tsx
- main.tsx
-backend
- app
- __init__.py
- config.py
- views.py
- requirements.txt
- key.env
今回触れるファイルは網羅しているつもりですが、もし不足あったらこちらをご参照ください
フロントエンド
以下の役割を意識して、それぞれ最低限の見た目を作るコードを書いてみます。
- ルーティング:main.tsx, App.tsx
- ユーザーが食べ物を入力できるフォーム画面:Home.tsx
- 返ってきたレシピを表示する一覧画面と、その詳細を表示するダイアログ:List.tsx
詳細はフロントエンドの皆様にお譲りするとして、これでバックエンドに通信して、レスポンスで返ってきたデータを受け取り、表示する画面の実装ができました!
バックエンド
1. envファイルの作成
2. 必要なパッケージのインストール
requirements.txtに以下を記述し、pipで必要なパッケージを一括でインストールします。
3. Flaskアプリの作成:run.py
4. Flaskアプリケーションのインスタンスの作成(run.pyに書く説もあるっぽい?)、設定や拡張機能の初期化:__init__.py
5. ルーティング・ビューの設定 :views.py
ビューでは、ルーティングからリクエスト情報を受け取り、指定されたテンプレートを読み込んで、レスポンスとして返すデータを生成する という処理を行います。
Djangoではルーティングでurls.pyというものがあったけれど、Flaskでは望む処理を書いた関数のデコレータとしてurlを指定すれば良いらしい🤔
今回の場合は、以下の流れを作ります!下線部においてChatGPTのAPIを利用しています。
- リクエストで食材の名称のリストを受け取る
- リクエストで受け取った食材のリストからレシピ名と材料、レシピ手順を生成してもらう
- 生成されたものをjson形式でレスポンスとして返す
つまづいたポイントとしては、ChatGPTから返ってくるデータをjsonっぽい見た目にしてしまったせいで文字列で返って来ていることに気付かず、json風の文字列をフロントエンドで処理しようとしたことです…。object型に変換するのを忘れずに。
おわりに
このように外部APIを利用すると、とっても簡単に高度な機能を実装することができました!私も今回初めて使用してみましたが、めちゃめちゃ夢がある...✨
明日はMahiroさんの記事です!とってもアクティブで有望な新入生!!お楽しみに🎁