1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

URLのパスに紐づくjsonデータを返すテストサーバー(wsl+docker+FastAPI)

Last updated at Posted at 2021-11-13

はじめに

Restの動作確認をするときにとりあえずテストファイルのjsonデータを返してくれるdockerの上に乗ったFastAPIサーバーを作っています
※testdataのフォルダ以下にtest.json があれば http://***/testdata/test にリクエストすればtest.jsonのデータが返ってくるような仕組み

環境

Windows10 + WSL(Ubuntu 20.04.3 LTS)

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
・・・

docker 20.10.10

$ docker -v
Docker version 20.10.10, build b485636

フォルダ構成

fastapi
 ├ Dockerfile
 └ app
   ├ main.py
   └ testdata
     ├ temp.json
     └ ...

※確認時は/home/user名 にdockerフォルダを作ってその中にfastapiを展開

変更

テストサーバーなので、接続フリーな設定を追加しました

ファイル

書くのが面倒な方は、こちら からダウンロード

Dockerfile
# 3.6以降なら大丈夫みたい
FROM python:3.9-slim-buster

# pipのupgrade (Warning出るけど、お気になさらずに...)
RUN pip install -U pip

# fastapiとuvicornのインストール
RUN pip install fastapi uvicorn

# ポートはデフォルトの8000で利用
EXPOSE 8000

# デフォルトのディレクトリ設定
WORKDIR /app

# サーバー起動
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import json
import uvicorn
import os

app = FastAPI()
# テストサーバーなので、アクセスオールフリー
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

jsonExtention = ".json"


@app.api_route("/{path:path}", methods=["GET", "POST"])
async def catch_all(path: str):

    # カレントまでの絶対パス取得
    absPath = os.path.abspath(".")
    jsonFilePath = f"{absPath}{os.sep}{path}"

    # jsonの拡張子付きではない時
    if os.path.splitext(jsonFilePath)[1] != jsonExtention:
        jsonFilePath = f"{jsonFilePath}{jsonExtention}"

    # ファイルが存在するか
    if os.path.exists(jsonFilePath):
        jsn = None
        with open(jsonFilePath, "r", encoding="utf-8") as f:
            jsn = json.load(f)
        return jsn

    # ファイルがない時
    return {"message": "error"}
temp.json
{ "test": "テスト" }

※こちらはファイル名や内容についてはお好みで

コンテナ構築シェル

# dockerファイルのイメージビルド
sudo docker build -t fatestimage .
# コンテナ化(-v appのフォルダ共有、-p 8000ポート使用)
sudo docker run -d --name fatest -v $PWD/app:/app -p 8000:8000 fatestimage

※上記フォルダ構成の fastapi 以下で実行

動作確認

image.png

運用アドバイス

\\wsl$ でエクスプローラーからwslにアクセス可能。あとはフォルダとjsonファイルを勝手に作ってアクセス先を増やしたりすればよいかと

最後に

なにも設定してないEdgeが、確認画面をペーストするときに便利なことに気づきました

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?