rating이 없는 dict 값 반환이 목표 1. 새로운 BaseModel 생성 class BookNoRating(BaseModel): id: UUID title: str = Field(min_length=1) author: str description: Optional[str] = Field( None, title='Description of the Book', max_length=100, min_length=1 ) 2. 새로운 함수 생성(response_model 정의) @app.get("/book/rating/{book_id}", response_model=BookNoRating) async def read_book_no_rating(book_id:UUID): for x in BOOKS: if x...
HTTP 에러를 사용자에 맞게 커스텀이 가능하다.(음수가 조건에 들어왔을 때 에러가 나오게 하는 게 목표) 1. import JSONResponse, Request from fastapi import FastAPI, HTTPException, Request from starlette.responses import JSONResponse 2. Exception을 상속하는 클래스 생성 class NegativeNumberException(Exception): def __init__(self, books_to_return: int): self.books_to_return = books_to_return 3. @app.exception_handler() 데코레이션을 사용하여 handler를 등록 @app.exc..
HTTP 예외를 이용한 API 에러 처리 방법 1. import HTTPException from fastapi import FastAPI, HTTPException 2. 함수 안에 구문 추가 매개변수로 받은 값이 존재하지 않을 때 일으키는 에러 구문 @app.delete("/{book_id}") async def delete_book(book_id: UUID): counter = 0 for BOOK in BOOKS: counter += 1 if BOOK.id == book_id: del BOOKS[counter - 1] return f'ID:{book_id} deleted' raise HTTPException(status_code=404, detail='Book not found') book_id를 넣..
1. DELETE 데이터 삭제 2. 함수 생성 @app.delete("/{book_id}") async def delete_book(book_id: UUID): counter = 0 for BOOK in BOOKS: counter += 1 if BOOK.id == book_id: del BOOKS[counter - 1] return f'ID:{book_id} deleted' 경로 매개변수 book_id로 UUID를 받음 counter라는 변수에 0으로 초기화 BOOKS list를 for문을 돌면서 dict를 하나씩 꺼내서 확인 dict의 id키의 value 값과 book_id로 받은 UUID의 값의 일치 여부를 확인 일치하다면 BOOKS의 인덱스로 접근해 삭제한 후 삭제 멘트 return 3. Swagg..
1. PUT 데이터 업데이트 2. 함수 생성 @app.put("/{book_id}") async def update_book(book_id: UUID, book: Book): counter = 0 for BOOK in BOOKS: counter += 1 if BOOK.id == book_id: BOOKS[counter - 1] = book return BOOKS[counter - 1] book_id를 경로 매개변수로 UUID로 받고 book을 Book 클래스로 받음.(필수적 매개변수 같이 보이지만 Book 클래스가 정의 되어있음으로 아님) counter라는 변수에 0을 넣으며 초기화 BOOKS list를 for문을 돌며 BOOK dict를 한개씩 꺼내서 확인 for문이 한번 돌 때마다 counter에 1..
1. 새로운 API 생성 book_id로 UUID를 받는다. BOOKS list을 돌면서 한개의 dict를 뺀다. dict의 id에 접근해서 value인 UUID를 값을 url로 들어온 book_id와 같은지 확인한다. 조건에 부합한다면 해당 dict의 값을 return 한다. @app.get("/book/{book_id}") async def read_book(book_id:UUID): for x in BOOKS: if x.id == book_id: return x 2. Swagger 확인 ex) db6d5c1f-0460-4bab-8aa1-a801bf843273 id로 확인한다. 딕셔너리의 id에 접근해서 value가 같은지 확인한다. book_1 = Book(id="db6d5c1f-0460-4bab-..
1. 함수 생성(쿼리 매개변수) 선택적 매개변수로(int 형을 받음) 매개변수에 값을 넣지 않으면 default로 None을 반환 @app.get("/") async def read_all_books(books_to_return: Optional[int] = None): if len(BOOKS) > new_books[0] >> book_1 return ex) books_to_return = 2 >> new_books[0] and new_books[1] >> book_1 and book_2 return @..
1. BaseModel의 구성 정의 Book 클래스에 값을 넣을 때 구성이 어떻게 되는지, 어떤 값들이 들어가는지 예시를 보여줄 수 있다. class Book(BaseModel): id: UUID title: str = Field(min_length=1) author: str = Field(min_length=1, max_length=100) description: Optional[str] = Field(title="Description of the book", max_length=100, min_length=1) rating: int = Field(gt=-1, lt=101) #Config가 Book 클래스의 Example Values class Config: schema_extra = { "exampl..
1. 비동기 없이 함수 생성 4개의 책에 Book클래스를 정의 def create_books_no_api(): book_1 = Book(id="637d1b93-0174-48e7-8959-e17530b6c690", title="Title 1", author="Author 1", description="Description 1", rating=60) book_2 = Book(id="637d1b93-0174-48e7-8959-e17530b6c690", title="Title 2", author="Author 2", description="Description 2", rating=60) book_3 = Book(id="637d1b93-0174-48e7-8959-e17530b6c690", title="Title ..
1. 새로운 Field를 추가 class Book(BaseModel): id: UUID title: str = Field(min_length=1) author: str = Field(min_length=1, max_length=100) #최소길이는 1, 최대길이는 100 description: Optional[str] = Field(title="Description of the book", max_length=100, min_length=1) rating: int = Field(gt=-1, lt=101) #-1보다는 크고 101보다는 작다 (0~100사이) 2. Swagger 확인 Schemas에 추가 된 것을 볼 수 있다. 3. rating의 Field의 유효성 검사 rating에 101과 102를 넣..