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

FastAPI+React+DockerでQiitaみたいなサイトを作ってみたい -2日目-

Last updated at Posted at 2021-12-22

目次

2日目 - /docsの作成

API構成からDocsを作る

昨日はHelloWorldの出力止まりだったので、ここでQiitaっぽいサイトを作るときのAPI構成を考える。

モデル

  • User
  • Post
  • Lgtm

一旦このくらいあればいいかな。
んでそれぞれのDBのリレーションを作る
スクリーンショット 2021-12-22 18.36.25.png

本当はもっといろいろ詰め込まないといけないんだけど、色々やりすぎると時間かかりすぎるので。
でAPI構成は一旦こんな感じ。

- User
POST /users
GET  /user/{user_id} 

- Post
GET    /posts
POST   /posts
GGET   /post/{post_id}
POST   /post/{post_id}/lgtm
DELETE /post/{post_id}/lgtm

ルーターの設定

api/v1下にroutersのディレクトリを作成し、各ルーティング種別ごとにファイルを作る

api/v1/routers/user.py
from fastapi import APIRouter

router = APIRouter()

@router.post('/users')
def create_user():
  pass

@router.get('/user/{user_id}')
def get_user():
  pass
api/v1/routers/post.py
from fastapi import APIRouter

router = APIRouter()

@router.get('/posts')
def get_posts():
  pass

@router.post('/posts')
def create_post():
  pass

@router.get('/post/{post_id}')
def get_post():
  pass

@router.post('/post/{post_id}/lgtm')
def add_lgtm():
  pass

@router.delete('/post/{post_id}/lgtm')
def delete_lgtm():
  pass

でmain.pyのでこのrouterを読み込む

api/v1/main.py
from fastapi import FastAPI

from api.v1.routers import user,post

app = FastAPI()

app.include_router(user.router)
app.include_router(post.router)

これでルーティングだけは反映されている。
docker-compose up してlocalhost:8000/docにアクセスするとルーティング情報(中身はなんもない)が表示される。
スクリーンショット 2021-12-22 19.26.06.png

きっと実務ではAPIの仕様を固めれば、サーバーサイドとフロントエンドで構築をそれぞれ始めることができると思うので、それぞれの仕様まで作っておく。

FastAPIではschemaとしてそれぞれのルーティングにIO情報を設定しておくことで先程のDocsで仕様を確認できるらしい。

なのでapi/vi/schemasディレクトリを作成し、それぞれのschema情報を設定。

api/v1/schemas/user.py
from pydantic import BaseModel, Field

class UserBase(BaseModel):
  login_id: str = Field(None, description="ログインID")
  name: str = Field(None, description="表示名")
  description: str = Field(None, description="プロフィール文")

class User(UserBase):
  id: int

class UserCreateRequest(UserBase):
  password: str = Field(None, description="パスワード")
api/v1/schemas/post.py
from pydantic import BaseModel, Field

import api.v1.schemas.user as user_schema

class PostBase(BaseModel):
  title: str = Field(None, description="投稿タイトル")
  context: str = Field(None, description="投稿本文")

class Post(PostBase):
  id: int
  user: user_schema.User = Field(None, description="投稿ユーザー情報")
  lgtm_count: int = Field(0, description="LGTM数")

class PostCreateRequest(PostBase):
  user_id: int = Field(None, description="ユーザーID")

これをそれぞれのrouterに記述していく

api.v1.routers.user.py
from fastapi import APIRouter

import api.v1.schemas.user as user_schema

router = APIRouter()

@router.post('/users',response_model=user_schema.User)
def create_user(user:user_schema.UserCreateRequest):
  pass

@router.get('/user/{user_id}',response_model=user_schema.User)
def get_user():
  pass
api.v1.routers.post.py
from fastapi import APIRouter
from typing import List

import api.v1.schemas.post as post_schema

router = APIRouter()

@router.get('/posts',response_model=List[post_schema.Post])
def get_posts():
  pass

@router.post('/posts',response_model=post_schema.Post)
def create_post(post:post_schema.PostCreateRequest):
  pass

@router.get('/post/{post_id}',response_model=post_schema.Post)
def get_post():
  pass

@router.post('/post/{post_id}/lgtm',response_model=post_schema.Post)
def add_lgtm():
  pass

@router.delete('/post/{post_id}/lgtm',response_model=post_schema.Post)
def delete_lgtm():
  pass

本当はLGTMとかのレスポンスはLGTM数とかだけでいいのかもだけど一旦はこの構築にしておく。

ここまで書くとdocsがいい感じになる
スクリーンショット 2021-12-22 20.09.09.png

これをもとにサーバーサイドとフロントサイドでそれぞれ開発を行えそう。
便利だなぁ。

後々色々付け足すかもしれないけど、一旦はここまで。

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