본문 바로가기
반응형

Python19

[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.
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 배우기 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 배우기 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.
Fast API 배우기 8부 - Example Data 넣기 Example Data 넣기 모델에 Confg 클래스를 정의한뒤 schema_extra 에 값을 넣으면 example 데이터를 넣을 수 있다. from typing import 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 class Config: schema_extra = { "example": { "name": "Foo", "description": "A very nice Item", "price": 35.4.. 2021. 11. 1.
Fast API 배우기 4부 - Query 클래스 이번시간에는 Query Parameter를 좀더 심도있게 다뤄보자. 심도있게 다룬다는 말은 쿼리파라미터에 본래모습을 학습하고 여러 기능을 사용해보자는 의미 from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/items/") async def read_items(q: Optional[str] = None): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: results.update({"q": q}) return results 위 예제에서는 q가 쿼리 파라미터이고 Optional인 상황이다 Query 클래스 쿼리 파라미터를 심도있게 다루기 .. 2021. 10. 20.
Fast API 배우기 3부 - Request Body Request Body & Response Body란? Request Body : 클라이언트가 API로 데이터를 보낼때 사용되는 데이터 Response Body : API가 request의 응답으로 클라이언트에게 보내는 데이터 path 파라미터, query 파라미터는 url에서 어떤 데이터를 보내는지 볼 수 있다. 이 데이터들 말고 url에서 보이지 않는 데이터를 실어 보낼 때 body 파라미터를 사용한다고 생각하면 된다. API(백엔드)는 거의 모든경우에 response body를 클라이언트에게 보내야 한다. 하지만 클라이언트는 꼭 request body를 보내지 않아도 된다. fast api에서는 request body를 만들기 위해선 Pydantic models 를 사용한다 Pydantic의 Bas.. 2021. 10. 20.
Fast API 배우기 2부 - query parameters Query Parameter란? 함수에 사용되는 parameter인데 path parameter에 없는 파라미터를 의미한다 from fastapi import FastAPI app = FastAPI() fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}] @app.get("/items/") async def read_item(skip: int = 0, limit: int = 10): return fake_items_db[skip : skip + limit] 위 코드에서 skip과 limit은 query로 값을 받는 파라미터이다. 저 skip과 limit에 값을 넣어주고 싶으면 ? 와 &를 이용한다. 아래와 같이.. 2021. 10. 19.
Fast API 배우기 1부 - 시작 및 path parameter Fast API란? 파이썬 웹 프레임워크중 가장 빠른속도를 지닌 프레임워크. Node.js와 Go와 속도가 맞먹는다 속도만 빠를뿐만 아니라 개발속도도 미치도록 빠르다 인터넷에 자료는 적지만 그걸 커버쳐줄만큼 document가 잘되어있다 1. 설치 두줄이면 끝. 쉽쥬? pip install fastapi pip install "uvicorn[standard]" 2. Hello World 출력하기 말도 안되게 간단하쥬? from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} 아래 커맨드로 실행해보자 uvicorn main:app --reload 그리고 로컬서버로 접속!.. 2021. 10. 18.
[백준 15649] N과 M (1) www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 입력 첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8) 출력 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으.. 2021. 3. 11.
파이썬 heapq 커스텀 정렬 이용하기 파이썬에서 커스텀 정렬을 이용할 때 리턴값을 True False가 아닌 1, -1로 해주어야 함을 확인하였다. 이번에는 여러개의 멤버변수를 가진 클래스를 heapq를 이용해 heap을 만들어줄 때 custom comparator를 어떻게 이용하는지 알아보자. 결론부터 말하면 class 안에 __lt__(self, other) 함수를 재정의 해 주고 return 값은 True False로 해주면 된다. 이유는 간단하다. heapq의 소스코드를 분석해보면 힙정렬을 할 때 연산기호로 < 를 사용하기 떄문에 __lt__ 재정의 해 주어야 한다 위에 보면 연산기호가 < 인것을 확인할 수 있다 import heapq class node: def __init__(self, A, B): self.A = A self.B.. 2021. 3. 10.
파이썬 커스텀 정렬 이용하기 파이썬 3.x 이상 버전 from functools import cmp_to_key def comp(x, y): if x[0] 0 def __eq__(self, other): return mycmp(self.obj, other.obj) == 0 def __le__(self, other): return mycmp(self.obj, other.obj) = 0 __hash__ = None return K 리스트 내부 sort 안에 custom comparator를 넣어주는 케이스도 위와 동일하다. l.sort(key=cmp_to_key(comp)) 파이썬 2.x 버전 def custom_cmp(x, y): if x[0] > y[0]: return True else: return -1 l = [] l.appen.. 2021. 3. 10.
반응형