Python의 ORM 라이브러리인 Sqlalchemy를 이용해서 데이터베이스와 연결해 보기 1. Sqlalchemy란? ORM(Object Relational Mapping)을 사용할 수 있게 도와주는 데이터베이스 관련 툴킷 파이썬을 기반으로 한 오픈소스 객체 지향적인 코드를 만들 수 있음 2. ORM 이란? 객체와 데이터베이스의 관계를 매핑 코드의 가독성도 높아지고 코드의 재사용&유지보수에 대한 편리성이 증가 파이썬 클래스를 관계형 데이터베이스의 테이블로 해석하고, 파이썬형태의 SQLAlchemy 표현언어를 SQL로 변환 1. Sqlalchemy 사용해 보기 라이브러리 설치 pip install sqlalchemy 작업 환경 세팅 todoapp 폴더 생성 폴더 하위에 database.py 생성 from..
데이터베이스가 무엇인지, 데이터가 무엇인지, SQL은 무엇인지 아는것이 목표 1. DataBase 란? 컴퓨터에 저장된 데이터의 구조화된 정보 또는 조직화 된 모음 = 데이터의 집합, 저장소 DBMS(데이터베이스 관리 시스템)에 의해 제어 되며 데이터와 DBMS를 하나로 묶어 데이터베이스라고 한다. 2. DataBase 특징 데이터에 쉽게 접근 할 수 있고 데이터를 검색, 삽입, 수정, 삭제 할 수 있다. 다수의 사용자가 동시에 데이터를 컨트롤하고 조직화 할 수 있다. 3. DBMS 란? 데이터베이스를 운영하고 관리하는 소프트웨어 동시 접속 및 데이터 공유가 가능하다. Relational DBMS를 많이 쓴다 ※ DBMS 대표적인 종류 명칭 개발사 작동 운영체제 추가 사항 MySQL Oracle Unix..
Pydantic, BaseModel, Data Validation, CRUD, UUID 1. Pydantic FastAPI 내에서 Data Validation(데이터 유효성)을 검사하고 관리하는 라이브러리 클래스 모델에 속해있는 값들에 적합한 자료형을 코드에 선언하고 자료형을 검증하는 것을 도와준다. 선언한 자료형과 일치하는 않는 자료형을 가진 값이 대입되는 경우, Data Validation(데이터 유효성) 오류가 발생한다. Python에서 기본적으로 제공하는 json 모듈의 loads를 이용해 JSON 모델로 반환하는데 이것을 서포터 해준다. 즉, 선언한 자료형의 값들에 벗어나는 경우에 대해 검사를 한다. 우선, 정의를 하기 위해서는 BaseModel을 상속을 받아서 구현해야 한다. from pyda..
인증해서 읽고 싶은 책 가져오는 것이 목표(연습하기) 1. async def book_login API 생성 2. username / password는 헤더를 사용해서 query parameter로 받는다.(username: FastAPIUser, password: test1234!) 3. username / password가 맞지 않는 경우 "Invalid User"을 반환한다. 1. 전체 코드 from typing import Optional from fastapi import FastAPI, Header from pydantic import BaseModel, Field from uuid import UUID app = FastAPI() @app.post("/books/login") async de..
Headers로 GET 요청 할 때 추가 정보를 보내기 1. import Header from fastapi import FastAPI, Header 2. 함수 생성 @app.get("/header") async def read_header(random_header: Optional[str] = Header(None)): return {"Random-Header": random_header} read_header 함수에 Header를 붙히지 않는다면 선택적 쿼리 매개변수가 된다. Header의 옵션 1. 하이픈(-)을 자동으로 언더바(_)로 변환시킨다. 이런 옵션을 사용하고 싶지 않는다면?(convert_underscores=False 추가) @app.get("/header") async def read..
Form Field를 사용해서 데이터를 전달 하는 것이 목표 1. import Form from fastapi import FastAPI, Form 2. 로그인 API 함수 생성 FastAPI vesion 0.78.0 버전 부터 Form(...) -> Form() "..." 생략이 가능하다. @app.post("/books/login") async def book_login(username: str = Form(...), password: str = Form(...)): return {"username":username, "password":password} username과 password의 type hint를 string 지정 dict형태로 return 값을 받는다. 3. Swagger 확인 Form..
상태 코드를 추가하는 방법을 알아보는것이 목표 1. import status from fastapi import FastAPI, status 2. 함수 정의 @app.post("/", status_code=status.HTTP_201_CREATED) async def create_book(book: Book): BOOKS.append(book) return book 201 은 "생성됨"를 의미하는 상태 코드 3. Swagger 확인 "status_code=status.HTTP_201_CREATED"을 넣었을 때 상태 코드 201을 받은 것을 볼 수 있다. 하지만 "status_code=status.HTTP_201_CREATED" 없을 때는 상태 코드 200을 받은 것을 볼 수 있다.
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를 넣..