FastAPI - Get, Post, Form

홍찬우·2023년 7월 30일

Request Body 예제 코드

from typing import Optional
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

app = FastAPI()
@app.post("/items/")
def create_item(item: Item):
    return item

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)
  • 해당 코드 실행하고 localhost:8000/items/로 접속하면,

    • detail: Not Found 에러와 함께 GET: 404 Not Found 에러 발생

💡 브라우저에 localhost:8000/items 주소를 직접 입력하는 것 자체가 GET 방식
하지만 현재 코드는 POST Method에 대한 코드만 존재
따라서 GET Method는 에러가 발생

→ 이에 따라 클라이언트와 유사하게 test 파이썬 파일을 생성


import requests

item_data = {
    "name": "Example Item",
    "description": "This is an example item",
    "price": 9.99
}

response = requests.post("http://localhost:8000/items", json=item_data)
print(response.json())
  • requests.post 이용해 GET이 아닌 POST Method 접근

    • 제대로 return 하는 것을 확인 가능
    • 서버에서도 POST 200 OK



Form 예제 코드

from fastapi import FastAPI, Form, Request
from fastapi.templating import Jinja2Templates
import uvicorn

app = FastAPI()
templates = Jinja2Templates(directory='./')

@app.get("/login/")
def get_login_form(request: Request):
    return templates.TemplateResponse('login_form.html', context={'request': request})

@app.post("/login/")
def login(username: str = Form(...), password: str = Form(...)):
    return {"username": username}

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)
  • 해당 코드도 app.get(”/login/”) 부분 없이 에러 발생

    • localhost:8000/login/ 접속한다는 것 → GET Method

    • 따라서 app.get(”/login/”) 없으면 위 예시와 같이 에러

  • 이를 해결하기 위해 GET으로 html 먼저 받은 후, POST 실행


  • Swagger 확인하면, 값을 제대로 return 했음에도 422 Validation Error 표시하는 것을 확인할 수 있음
    ⇒ 이는 default로 진짜 error가 난 것이 아니라 error가 발생했거나, 성공이 잘 되었을 때 아래와 같이 뜨는 것이라고 보여주는 것임
profile
AI-Kid

0개의 댓글