본문 바로가기

개발이야기/Python

FastAPI로 CRUD 구현하기

728x90

1부에서는 간단하게 FastAPI에 대해 소개하고 Hello world 를 작성해봤다.

2022.09.16 - [개발이야기/Python] - 정말 빠른 Fast API

What things to do

  • 블로그의 Back-end를 구현
  • 블로그의 게시글을 조회하고, 생성하고, 업데이트하고 삭제하는 CRUD를 구현
    • GET
    • POST
    • PUT
    • DELETE

1. GET

먼저 main.py에 아래와 같이 추가 작성해보자.

# main.py
from typing import Optional
from fastapi import FastAPI

fake_db = []

app = FastAPI()

@app.get('/')
def helloworld():
    return {'message':'Hello World'}

@app.get('/posts/')
def get_posts():
    return fake_db

@app.get('/posts/{post_id}')
def get_post(post_id: int, query: Optional[str]=None):
    post = fake_db[post_id]
    if query:
        post['query'] = query
    return post

임시 Database로 활용할 빈리스트를 fake_db 로 선언했다.

작성했던 helloworld 함수 아래 get_posts, get_post 함수를 작성했다.

두 함수의 경로는 모두 /posts 로 설정했다.

get_posts는 전체 게시글의 List, get_post는 단일 게시글을 조회하는 기능을 갖는다.

http://127.0.0.1/posts 로 요청해보자.

# https://127.0.0.1/posts
[]

아직 데이터가 없어서 빈리스트를 반환한다.

get_post 함수는 게시글의 id 인 post_id를 받아 해당 id 에 해당하는 게시글의 내용을 반환한다.

아직, 게시글이 없기때문에 요청하게 되면 Internal server error가 발생한다.

또한 아래처럼 get_post에는 옵션으로 query라는 이름으로 query parameter도 전달이 가능하다.

http://127.0.0.1/posts/0?query=test

스웨거에서도 아래처럼 확인이 가능하다.

Data modeling

추가적인 기능 작성에 앞서 이 프로젝트에서 다뤄질 데이터 모델을 정의해보겠다.

먼저 pydantic 모듈의 BaseModel을 import한다.

...
from pydantic import BaseModel
...

그리고 아래와 같이 Post 모델을 추가해보자

...

app = FastAPI()

class Post(BaseModel):
    title: str
    author: str
    contents: str

...

2. POST

이번에는 새로운 Post를 등록하는 create_post 함수를 작성해보자.

@app.post('/posts/')
def create_post(post: Post):
    fake_db.append(post.dict())
    return fake_db[-1]

create_post 함수를 만들고 해당 함수의 인자로 앞서 만들었던 Post 모델을 지정한다.

이렇게하면 자동으로 변수의 validation check 가 자동으로 적용된다.

스웨거에서도 확인할 수 있다.

스웨거를 통해 여러 Post 를 생성해보겠다.

Post를 생성하면 생성한 Post를 확인 할 수 있도록 fake_db에 마지막 요소를 반환하게 했다.

이번엔 생성된 Post의 List를 확인해보자.

마찬가지로 스웨거에서 get_posts를 실행해보자.

추가한 Post가 잘 추가 된 것을 확인할 수 있다.

3. PUT

이번엔 작성된 Post를 수정하는 update_post를 만들어보자.

@app.put('/posts/{post_id}')
def update_post(post_id: int, post: Post):
    fake_db[post_id] = post
    return fake_db[post_id]

update_post는 post_id와 Post 모델을 인자로 받는 함수다.

업데이트 대상 post를 fake_db에서 불러와 새로운 post로 정의하도록 작성했다.

위 처럼 1번 post의 업데이트를 수행하면 업데이트가 이뤄지고 업데이트 된 post의 내용이 반환된다.

그리고 get_post를 사용해 수정된 1번 post의 내용을 조회하면 정상적으로 내용이 반영된 것을 확인 할 수 있다.

4. DELETE

마지막으로 Post를 삭제하는 delete_post함수를 작성해보자.

@app.delete('/posts/{post_id}')
def delete_post(post_id: int):
	deleted = fake_db.pop(post_id)
    return deleted

delete_post 함수는 삭제할 post 의 id 를 받아서 fake_db.pop 을 사용해 해당 리스트에서 삭제하고 삭제된 post의 내용을 반환하고 있다.


지금까지 FastAPI 에서 GET, POST, PUT, DELETE 기능을 작성해 봤다.

아직 까진 list인 fake_db 를 사용하고 있기 때문에 FastAPI가 재시작 되면 저장했던 데이터는 모두 사라진다.

다음 Post에서는 fake_db가 아닌 실제 Database 와 연동하는 방법을 소개해보겠다.

 

참고로 아래는 지금까지 작성된 전체 코드이다.

# main.py
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

fake_db = []

app = FastAPI()
class Post(BaseModel):
    title: str
    author: str
    contents: str

@app.get('/')
def helloworld():
    return {'message':'Hello World'}

@app.get('/posts/')
def get_posts():
    return fake_db

@app.get('/posts/{post_id}')
def get_post(post_id: int, query: Optional[str]=None):
    post = fake_db[post_id]
    if query:
        post['query'] = query
    return post

@app.post('/posts/')
def create_post(post: Post):
    fake_db.append(post.dict())
    return fake_db[-1]

@app.put('/posts/{post_id}')
def update_post(post_id: int, post: Post):
    fake_db[post_id] = post
    return fake_db[post_id]

@app.delete('/posts/{post_id}')
def delete_post(post_id: int):
    deleted = fake_db.pop(post_id)
    return deleted

 

'개발이야기 > Python' 카테고리의 다른 글

Django에서 Request Log를 쉽게 확인해보자  (0) 2023.02.15
Pyenv 설치와 사용법 - Python 버전 관리 도구  (0) 2023.01.26
FastAPI에 SQLAlchemy 연동하기  (0) 2023.01.20
정말 빠른 Fast API  (0) 2022.09.16
Python?  (0) 2022.09.02