본문 바로가기
반응형

fastapi25

[FastAPI] SQLModel 배우기 https://sqlmodel.tiangolo.com/tutorial/fastapi/simple-hero-api/ Simple Hero API with FastAPI - SQLModel SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness. sqlmodel.tiangolo.com 1. SQL Model이란 fastapi에서 가장 큰 단점은, 데이터베이스의 스키마와, API의 스키마를 각각 SQLAlchemy, Pydantic으로 따로 작성해주어야 한다는 점이다. 이로인해 코드 유지보수에 어려움이 있었다. SQLModel이란, SQLAlchemy와 Pydantic을 서로 합친 것이다. 두 패키지 위에.. 2023. 12. 13.
[FastAPI] 이미지 파일 업로드 하기 백엔드 서버에 이미지 파일을 저장해야 하는 일이 있다. 가령 게시판에 사진을 올린다던지. 헌데 이미지파일을 DB에 저장하면 DB 쿼리 성능을 저하시킨다. 이때문에 서버에 이미지를 저장할 때에는 서버의 파일 시스템에 이미지를 저장 DB에는 이 파일의 URL만 저장해야한다 아래는 FastAPI에 파일을 저장하는 예제이다. 파일 파라미터에는 UploadFile을 사용한다 그리고 파일명이 중복되지 않도록 파일명을 저장되는 시간 + 임의의 램덤해시값으로 저장한다. from fastapi import UploadFile, File BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_DIR = os.path.join(BASE_DI.. 2021. 12. 13.
[postgresql] create table 하는 방법 아래처럼 create_db.py를 만든 후에 Base와 엔진을 임포트 한다. 그리고 아래와 같은 코드를 적으면 table을 만들어준다 from database.database import Base, engine from database.models import User print('create database..') Base.metadata.create_all(engine) 2021. 11. 17.
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)? jose 모듈을 설치하고 fastapi를 실행할때 저런 에러가 뜬다 아마 하기와 같은 커맨드로 jose를 설치해서 생긴 문제이다. pip install jose 아래와 같이 바꿔주면 해결된다. pip uninstall jose pip install "python-jose[cryptography]" 2021. 11. 17.
Is the server running locally and accepting connections on that socket postgresql 사용하면서 저런 에러가 뜨는 경우가 있다. 문제의 원인은 postgresql 의 url 경로가 잘못되서 생기는 경우이다. 나같은경우는 sql의 유저 account의 비밀번호 끝자리에 골뱅이 @가 있어서 문제가 되었다. 2021. 11. 16.
Fast API 배우기 24부 - 라우터 여지껏 우리는 API를 main.py에다가 작성하였다. 그런데 사실 모든 코드들을 main.py에다가 작성하는건 그리 좋지 못한 방법이다. 이번 시간에는 이 문제를 해결할 방법인 router에 대해 알아보겠다. 라우터란? mini fastapi application이라고 생각하면 될 것 같다. 한마디로 여러 API를 다른 파일에다 작성하고 이걸 main app에다가 넣었다 끼웠다 하면된다. 프로젝트 폴더 구조 fastapi 공식문서에서는 다음과 같은 폴더 구조를 사용하는것을 권장하고 있다. . ├── app │ ├── __init__.py │ ├── main.py │ ├── dependencies.py │ └── routers │ │ ├── __init__.py │ │ ├── items.py │ │ └─.. 2021. 11. 8.
Fast API 배우기 23부 - SQL 데이터베이스 FastAPI는 SQLAlchemy(파이썬에서 데이터베이스를 다루는 툴)을 이용해 데이터 베이스를 다를 수 있다. 아래가 대표적인 예시이다. PostgreSQL MySQL SQLite Oracle Microsoft SQL Server 이번 예제에서는 SQLite를 이용해 설명을 해보도록 하겠다. SQLite는 singe file로 관리되고 파이썬이 내부적으로 서포트 하고 있는 데이터베이스이다. ORM Object Relational Mapping 객체를 데이터베이스 테이블과 매칭시켜주는 tool이다. 한마디로 정의하면 프로그래밍 코드로 데이터베이스를 다룰 수 있다는걸 의미한다. 앞으로 나올 내용에서는 SQLAlchemy와 Pydantic 모델 내용이 나온다. SQLAlchemy : 실제 DB에 사용되는 .. 2021. 11. 8.
Fast API 배우기 22부 - CORS CORS란(Cross Origin Resource Sharing) CORS란 프론트엔드가 백엔드와 소통하는 자바스크립트 코드를 가지고 있는데, 백엔드와 프론트엔드의 Origin이 다를 때 생기는 상황이다. 보통 이런상황이면 저 자바스크립트 코드가 실행이 안된다. 그럼 어떻게 해결해야 할까? Origin이란? origin이란 protocol(http, https) + domain(myapp.com, localhost, localhost.tiangolo.com) + port(80,443,8080) 을 의미한다. http://127.0.0.1:8000/ 요런거 가령 모든 프론트엔드 백엔드가 localhost에 있어도, 포트번호가 다르면 다른 Origin이다. 자 예시를 들자. 당신이 프론트엔드를 http://.. 2021. 11. 5.
Fast API 배우기 21부 - Middleware Middleware middleware란 모든 리퀘스트에 대해 path operation이 수행되기전 실행되는 함수를 말한다. 또한 모든 response에 대해서도 reponse를 return해 주기 전에 실행되는 함수도 middleware가 된다. 그니깐 프론트엔드와 백엔드 사이에서 일하는 놈이라고 생각하면 될듯 request를 파라미터로 받는다. request에 대해 어떠한 작업을 할수 있다. 미들웨어가 작업을 끝내고 path operation에 리퀘스트를 넘겨준다 필요하면 reponse를 리턴해주기 전에도 어떤 작업을 수행할 수 있다. 마지막으로 reponse를 넘겨준다. Create a middleware 미들웨어를 만드려면 아래의 데코레이터를 사용하면 된다. @app.middleware("htt.. 2021. 11. 5.
Fast API 배우기 20부 - Security, authentication 인증 시스템 들어가기에 앞서 큰그림부터 살짝 훑자. 뭔말인지 이해안되면 이런게 있다 싶다는 정도로 넘어가면 된다. OAuth2 인증과 권한부여와 관련된 시스템이라고 생각하면 된다. 3rd party 인증시스템도 제공한다. 구글계정으로 로그인하기, 페이스북계정으로 로그인하기 이런것들 말이다. OpenID Connect OAuth2를 기반으로 하는 인증 시스템이다. OAuth2안에 애매모호한것들을 구체화 한 extends이기도 하다. 구글 로그인은 OpenID를 지원한다(물론 OAuth2기반 하에) 그러나 페이스북 로그인은 OpenID를 지원하지 않는다. OpenID(위의 OpenID Connect와 다름) OpenID Connect 처럼 만들어졌으나 OAuth2 기반이 아니다. 그리고 잘 안쓰인다 OpenAPI 누구나.. 2021. 11. 4.
Fast API 배우기 19부 - Dependency Injection Dependency Injection Dependency Injection이란 코드의 재활용을 위해 제공해주는 fastapi의 기능이다. 가령 두개의 path operation이 있다고 하자 path1, path2 두개 모두 덧셈을 하는 로직이 필요하다. 그리고 두 path operation에 둘다 덧셈을 해주는 로직을 각각 작성하였다. 똑같은 로직인데 비효율적이지 않은가? 이에대한 해결책은 덧셈을 하는 로직을 하나 만들고 두개의 path operation에 dependency 를 걸어주면 되는것이다! from typing import Optional from fastapi import Depends, FastAPI app = FastAPI() async def common_parameters(q: Op.. 2021. 11. 3.
Fast API 배우기 18부 - jsonable_encoder, PUT, PATCH jsonable_encoder 데이터 자료형을 json compatiable한 데이터로 바꿔주는 함수이다. 다른 파이썬 라이브러리를 사용할때 json 호환 데이터를 요구할 경우가 있다면 이 함수를 이용하자 가령 예를들면 데이터베이스는 Pydantic model을 받지 않고 dict만 받는 경우가 있다. 또는 datetime을 데이터베이스로 넘겨줄때 str로 바꿔주어야 한다. 이럴때 jsonable_encoder를 사용한다. 아래는 그 예제이다. from datetime import datetime from typing import Optional from fastapi import FastAPI from fastapi.encoders import jsonable_encoder from pydantic i.. 2021. 11. 3.
Fast API 배우기 17부 - Path Operation Configuration 이번에는 path operation의 세팅에 관련된 파라미터들을 배워보겠습니다. status_code status_code를 이용하여 response의 status code를 지정해 줄 수 있습니다. from typing import Optional, Set from fastapi import FastAPI, status from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str description: Optional[str] = None price: float tax: Optional[float] = None tags: Set[str] = [] @app.post("/items/", response_model=Item, .. 2021. 11. 3.
Fast API 배우기 16부 - Handling Errors HTTP Exception HTTPException 클래스를 이용하면 에러를 일으킬 수 있다. from fastapi import FastAPI, HTTPException app = FastAPI() items = {"foo": "The Foo Wrestlers"} @app.get("/items/{item_id}") async def read_item(item_id: str): if item_id not in items: raise HTTPException(status_code=404, detail="Item not found") return {"item": items[item_id]} 상기의 코드는 클라이언트가 접근하려는 아이템이 없을경우 404 에러를 일이키는 코드이다. HTTPException은 파.. 2021. 11. 2.
Fast API 배우기 15부 - Request Files File 클래스를 이용하면 클라이언트가 업로드하는 file을 다룰 수 있다. 사용법은 다음과 같다. File클래스를 import하고 UploadFile로 type 지정해준다. from fastapi import FastAPI, File, UploadFile app = FastAPI() @app.post("/files/") async def create_file(file: bytes = File(...)): return {"file_size": len(file)} @app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...)): return {"filename": file.filename} async def create.. 2021. 11. 2.
Fast API 배우기 14부 - Form Data Form Data JSON 대신에 form field를 받았다면 Form 클래스로 처리할 수 있다 from fastapi import FastAPI, Form app = FastAPI() @app.post("/login/") async def login(username: str = Form(...), password: str = Form(...)): return {"username": username} async def login(username: str = Form(...), password: str = Form(...)): 사용법은 이전에 배운 Body, Query, Path와 동일하다. 당연 위 예제에서는 ... 이 있으니 required이다. Form Fields에 대한 부연설명 HTML form.. 2021. 11. 2.
Fast API 배우기 13부 - Response Status Code 앞선 강의에서 reponse model을 지정해준것 처럼 response status code도 직접 지정해 줄 수 있다. 사용방법은 status_code를 이용하면 되고 아래의 operation들에게 사용가능하다 @app.get() @app.post() @app.put() @app.delete() etc. from fastapi import FastAPI app = FastAPI() @app.post("/items/", status_code=201) async def create_item(name: str): return {"name": name} status_code는 다음과 같은 역할을 한다 response에 status code를 지정해준다 docs에 status code를 표시해준다. 아래와 같.. 2021. 11. 1.
Fast API 배우기 12부 - Extra Model 앞선 예제에서 보았듯이 서로 연관된 여러 모델을 사용하는 경우가 많다. 아래의 경우가 대표적인 케이스이다 input model은 패스워드가 필요하다 output model은 패스워드를 포함하면 안된다. database model은 hash로 된 패스워드가 필요하다 위 케이스를 어떻게 해결하면 좋을까? 1. Multiple Models 가장 기초적인 해결방법이다. 각 케이스마다 모델을 따로 작성한다. from typing import Optional from fastapi import FastAPI from pydantic import BaseModel, EmailStr app = FastAPI() class UserIn(BaseModel): username: str password: str email: .. 2021. 11. 1.
Fast API 배우기 11부 - Response Model response_model 을 이용하여 아래의 operation들에 관한 response model을 지정해 줄 수 잇씁니다. @app.get() @app.post() @app.put() @app.delete() etc. from typing import List, Optional from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str description: Optional[str] = None price: float tax: Optional[float] = None tags: List[str] = [] @app.post("/items/", response_model=.. 2021. 11. 1.
Fast API 배우기 10부 - Cookie 파라미터, Header 파라미터 Cookie 파라미터 Query 클래스와 Path 클래스와 동일한 사용버븡로 Cookie 클래스를 이용하여 Cookie를 다룰 수 있다 from typing import Optional from fastapi import Cookie, FastAPI app = FastAPI() @app.get("/items/") async def read_items(ads_id: Optional[str] = Cookie(None)): return {"ads_id": ads_id} Headerr 파라미터 마찬가지로 Header 클래스를 이용해 Header를 다룰 수 있다 from typing import Optional from fastapi import FastAPI, Header app = FastAPI() @app... 2021. 11. 1.
반응형