1
0

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.

【Python+Flask】しりとりAPIを作ろう #3 ~しりとりAPI完成

Posted at

はじめに

この記事は第3回目です。
前回は【Python+Flask】しりとりAPIを作ろう #2 ~しりとりプログラム作成を参照してください

前回はしりとりプログラムを作成しました
今回はそのしりとりプログラムをFlaskを用いてしりとりAPIにします

環境

Dockerを使います
Docker DesktopもしくはDocker composeを使えるようにしておいてください

実際にやってみよう

最後にGithubリポジトリのURLを貼っているので良かったら参考にどうぞ

フォルダ構成

.
├── app
│   ├── output.txt
│   ├── server.py
│   └── siritori.py
├── docker
│   ├── Dockerfile
│   └── requirements.txt
└── docker-compose.yml

dockerフォルダ内

Dockerfileは安定のマルチステージビルド

docker/Dockerfile
FROM python:3.9-buster as builder
ENV PYTHONUNBUFFERED=1
COPY /docker/requirements.txt /
RUN /usr/local/bin/python -m pip install --upgrade pip \
  && pip install -r requirements.txt --no-cache-dir

FROM python:3.9-slim-buster
ENV PYTHONUNBUFFERED=1
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages/
RUN adduser myuser && chown -R myuser home/myuser
USER myuser
WORKDIR /home/myuser/app
CMD ["python", "server.py"]

他のライブラリを追加する場合はrequirements.txtに追加します

docker compose build を忘れない

docker/requirements.txt
flask

docker-compose.yml

docker-compose.yml
version: "3"

services:
  app:
    build:
      context: .
      dockerfile: ./docker/Dockerfile
    volumes:
      - ./app:/home/myuser/app
    tty: true
    restart: always
    ports:
      - 5000:5000

appフォルダ内

output.txtとsiritori.pyは前回作成しました

レスポンスはユースケースに合わせる

app/server.py
from flask import Flask, Response, request
from siritori import Siritori, FlagType

app = Flask(__name__)
siritori = Siritori("output.txt")

@app.route("/siritori", methods=['POST'])
def index():
  global siritori
  data = request.get_json()
  text = data["noun"]
  next_noun, type = siritori.return_nextnoun(text)
  if type is FlagType.USER_WIN.value:
    next_noun + "\nあなたの勝ちです"
  elif type is FlagType.USER_LOSE.value:
      next_noun + "\nあなたの負けです"
  return Response(response=next_noun, status=200)

@app.route("/init", methods=["GET"])
def init():
  global siritori
  siritori = Siritori("output.txt")
  return Response(response="しりとり" ,status=200)

if __name__ == "__main__":
  app.debug = True
  app.run(host="0.0.0.0", port=5000)
エンドポイント 概要
/init 初期化
/siritori しりとりする

実際に遊んでみよう!

まずはコンテナを立ち上げます

$ docker compose build
$ docker compose up -d

次にcurlで試します

流れとしては以下の通りです

  1. /initを叩く
  2. ゲーム終了まで/siritoriを叩く
$ curl localhost:5000/init
しりとり
$ curl -X POST -H "Content-Type: application/json" -d '{"noun": "りんご"}' http://localhost:5000/siritori
ごんげん
「ん」がついたのであなたの勝ち

最後に

全3回に分けてしりとりAPIを作成しました
APIなのでさまざまなユースケースに対応しているので実装してはいかがでしょうか

入力がひらがなのみ対応している
漢字やカタカナを入力したい場合はgooさんが提供しているひらがな化APIを用いた方が良いだろう

1回目

2回目

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?