6
7

More than 1 year has passed since last update.

Fast APIでWebAPIを作ってみる①

Posted at

FastAPIを使って、WebAPIを作ってみます。

せっかくkubernetesの環境を作ったので、その上で動かせるものを作ってみようと思い立ち、FastAPIを使って、WebAPIを作っていこうと思います。

開発環境

   バージョン
Python 3.10.4
FastAPI 0.78.0
Uvicorn 0.18.1
Docker 20.10.16

今回のお題

今回は
 ①FastAPIを使って簡単なAPIの作成
 ②dockerfileの作成
 ③docker-composeの作成
 ④FastAPIでrouterの設定
辺りまでを実装していきます。

実装

フォルダ構成は以下の通りです。

┣━backend/
┃  ┣━app
┃  ┃ ┣━api
┃  ┃ ┃ ┗━routes
┃  ┃ ┗━core
┃  ┣━Dockerfile
┃  ┗━requirements.txt
┗━docker-compose.yml

①FastAPIを使って簡単なAPIの作成

最初は、main.pyを作成していきます。
main.pyを作成する場所は、appフォルダの配下となります。

main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.api.routes.routes import router

app = FastAPI(title="IncidentManagement",version="0.0.1")

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    # cookieの共有を行う設定(defaultはFalse)
    allow_credentials=True,
    # 許可するHTTPメソッドを指定する。(defaultはGET)
    allow_methods=["*"],
    # オリジン間リクエストでサポートするHTTPリクエストヘッダーのリストを指定する。
    # Accept、Accept-Language、Content-Language、Content-Typeヘッダーが常に許可される。
    allow_headers=["*"],
)
app.include_router(router,prefix="/api")

②dockerfileの作成

続いてDockerfileの作成です。
作成する場所は、backendフォルダの直下となります。

Dockerfile.
# pythonのTags名を指定。
FROM python:3.10.4-alpine
# 処理を実行するフォルダ名を指定。
WORKDIR /backend
# 実行環境にインストールする内容を記載したtxtファイルを実行フォルダにコピーする
COPY ./requirements.txt /backend/requirements.txt
# requirements.txtで記載したミドルウェアのインストールの実行
RUN set -eux \
    && apk add --no-cache build-base \
    && pip install --upgrade pip setuptools wheel \
    && pip install --no-cache-dir --trusted-host pypi.python.org -r /backend/requirements.txt \
    && apk del build-base 

COPY . /backend

③docker-composeの作成

docker-compose.ymlの作成となります。
作成する場所は、backendフォルダと同じ階層のフォルダに作成します。

docker-compose.yml
version: '3.0'
services:
  server:
    build:
      context: ./backend
      dockerfile: Dockerfile
    volumes:
      - ./backend/:/backend/
    command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000
    ports:
      - 8000:8000

④FastAPIでrouterの設定

JSON形式のデータを返すだけの簡単なControllerとなります。

ma_compnayController.py
from typing import List
from fastapi import APIRouter

router = APIRouter()

@router.get("/all")
async def get_all_company():
    allcompanydata = [
        {"id":1,"company_cd":"0001","company_nm":"CompanyA"},
        {"id":2,"company_cd":"0002","company_nm":"CompanyB"}
    ]

    return allcompanydata

Routerの設定となります。
http://localhost/api/companys が叩かれたら、上記で作成したControllerを呼び出すように設定しています。

routes.py
from fastapi import APIRouter
from app.api.routes import ma_compnayController

router = APIRouter()

router.include_router(ma_compnayController.router,prefix="/companys",tags=["macompany"])

ここまで作成したら、一度dockerを起動してみようと思います。

$ docker-compose build
$ docker-compose up

コマンドに以下の様な内容が表示されたら正常にdockerが実行されたことになります。

$ docker-compose up
[+] Running 1/0
 - Container src-server-1  Created                                                                                                                                                                                   0.0s 
Attaching to src-server-1
src-server-1  | INFO:     Will watch for changes in these directories: ['/backend']
src-server-1  | INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
src-server-1  | INFO:     Started reloader process [1] using StatReload
src-server-1  | INFO:     Started server process [8]
src-server-1  | INFO:     Waiting for application startup.
src-server-1  | INFO:     Application startup complete.

この状態で、ブラウザから//localhost:8000を叩いてみたいと思います。
image.png

当然、root上には処理を何も設定していないので、エラーが返ってきます。

では、次に、//localhost:8000/api/companys/allを叩いてみたいと思います。
image.png
正常にcontrollerに設定したjson形式の値が返ってきました。

今回はここまでとなります。
次回は、docker上にpostgresqlを作成し、そこにアクセスできるようにしたいと思います。

参考にしたサイト

https://nmomos.com/tips/2021/01/23/fastapi-docker-1/
https://fastapi.tiangolo.com/ja/

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7