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 |