LoginSignup
0
2

More than 3 years have passed since last update.

React/FastAPI初心者が3日でCRUDする(1週間だけ頑張る Day6of9)

Last updated at Posted at 2021-04-15

 はじめに

1週間N(E)ETになった社会人の学習記録です。
今日もReactのサンプルを写経し、使い方を覚えます。
前回はReadまでできたので、Create/Update/Deleteを作ります。

実装

基本、参考サイト1 2 3のコピペ
「@material-ui/grid」から「@material-ui/data-grid」に変更した。

Create

1.classの利用

TypeScriptを使ったので、classを使ってちょっと固くしてみた。
VSCodeのTypeScript変換予測は超優秀だなと思った。

User.ts
interface User {
  username: string;
  email: string;
  password: string;
  is_active: boolean;
  is_superuser: boolean;
}

class User {
  constructor() {
    this.username = "new user";
    this.email = "sample@example.com";
    this.password = "p@ssw0rd";
    this.is_active = true;
    this.is_superuser = false;
  }
}

Rubyの「instance_variable_set」相当の書き方がわからなかった。
(参考元みたいにJSONのまま使うべきなのだろうか)

App.tsx
  handleInputChange(
    itemName: keyof User,
    e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>
  ) {
    const newUser = Object.assign({}, this.state.userInput)
    // さすがにこれはダサすぎる
    switch (itemName) {
      case 'username':
        newUser.username = e.target.value;
        break;
      case 'email':
        newUser.email = e.target.value;
        break;
      case 'password':
        newUser.password = e.target.value;
        break;
    }

    this.setState({
      userInput: newUser
    });
  }
App.js(参考元)
  handleInputChange(itemName, e) {
    const newUser = Object.assign({}, this.state.userInput)
    newUser[itemName] = e.target.value;

    this.setState({
      userInput: newUser
    });
  }

2.FastAPIの調整

FastAPIの戻り値にUser.idがなかったため、FastAPI側を修正した。

router.py
# usersをidで検索して「UserSelect」をjsonにして返します。
@router.get("/users/find", response_model=UserSelect)
async def users_findone(id: int, database: Database = Depends(get_connection)):
    query = users.select().where(users.columns.id==id)
    return await database.fetch_one(query)

@router.post("/users/create", response_model=UserSelect)
async def users_create(user: UserCreate, database: Database = Depends(get_connection)):
    # validatorは省略
    query = users.insert()
    values = get_users_insert_dict(user)
    ret = await database.execute(query, values)
    # もう一回取り直すので、ここがダサい。
    return await users_findone(ret, database)
    # return {**user.dict()} # オリジナル

Delete

1.FastAPIの調整

FastAPIのdeleteは送信する側のjsonのpropertyが必要なので、passwordを抜いたものを作った。(今思えばidだけでも良い。)

schema.py
# update用のrequest model
class UserUpdate(BaseModel):
    id : int
    username: str
    email: str
    password: str # updateにはpasswordがある
    is_active: bool
    is_superuser: bool

# delete用のrequest model
class UserDelete(BaseModel):
    id : int
    username:     str  # 今改めて考えたら不要
    email:        str  # 今改めて考えたら不要
    is_active:    bool # 今改めて考えたら不要
    is_superuser: bool # 今改めて考えたら不要

2.RESTのPath調整

RailsはとAPIのRESTが微妙に違うので調整。

    this.axios.delete(`/users/${id}`)           // for Rails
    this.axios.post("/users/delete/", userJson) // for FastAPI

Update

Modalはやめた。

所感

createやアップデートで作った分だけReact側のデータを更新するのは面白いなと思った。

App.tsx
  handleUserSubmit(e: { preventDefault: () => void; }) {
    e.preventDefault();
    const userJson = JSON.stringify(this.state.userInput);

    this.axios.post("/users/create", userJson)
      .then((res: { [x: string]: any; }) => {
        // ここのブラウザ側の情報更新を一部だけで済ましているのは賢いなと思った。
        const users = this.state.users.slice();
        users.push(res["data"]);
        this.setState({
          users: users,
          userInput: new User(),
        });
      })
      .catch((data: any) => {
        console.log(data)
      });
  }

やっぱりViewは好きじゃない。
予定より2日ほど遅れたので、このまま進むか悩み中。

免責事項(言い訳)

上記の技術については初心者なので、あてにしないように!!!

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