https://fastapi.tiangolo.com/ko

  • FastAPI :
    • 파이썬 고성능 비동기 모던 웹 프레임워크.
    • starlette(웹 서빙) + pydantic(데이터 모델링) = 기반으로 강력...
      • https://www.starlette.io
      • https://pydantic-docs.helpmanual.io
    • uvicorn 같은, ASGI 서버으로~ 보통 운영이 됨.
      • http://www.uvicorn.org
    • OpenAPI(Swagger) 를 따르도록 많은 지원이 됨.
    • [참고] typer : CLI 앱 프레엠워크. (FastAPI의 아우 격...)
      • https://typer.tiangolo.com
  • Features
    • ...
  • Learn - Python Types :
    • 함수 파라미터에 타입을 명시하도록 하여, 코드의 효율과 생산성이 높아지는 각종 기능을 제공함.
    • from typing import List Tuple Set Dict Union Optional 등등의 직관적인 활용.
    • 클래스 타입을 사용자 정의하고, 해당 Pydantic BaseModel 기반~ 각종 모델링 관련 기능을 손쉽고 편하게 지원.
    • class User(BaseModel):
      	id: int
          name: str
          joined: date
          
      data = {
          "id": 4,
          "name": "Mary",
          "joined": "2018-11-30",
      }
      user: User = User(**data) // User(id=4, name="Mary", joined="2018-11-30") 과 똑같은식...
    • ...
  • Learn - User Guide :
    • Request
      • Path & Query '선언' 및 '타입' 및 '검증'
        • bool, int, float, str, ... 및 Enum, file_path, ... 등등등 지원.
        • 필수적 or 선택적 파라미터 지원.
        • default=, ge=, le=, gt=, le=, min_length=, max_length= , alias, ... 등등등 지원.
        • List 형식의 Multiple Values 지원.
      • Body
        • pydantic BaseModel 기반, 클래스 타입을 인지. 
        • pydantic Field 기반, 속성의 vaild 및 meta 지정.
        • pydantic 내부Config 및 schema_extra 기반, 예시 작성.
        • 복합적인 구성 지원. 예) { "item": {...} , "user": {...} , "extra": 1 } 식으로 복수의 모델링 가능!
        • (별도의 Singular Values 도 가능하고, Embed 한 구조의 단일 모델링도 가능함)
        • List[타입] , Set[타입] , ... 지원 및 Nested Models 지원.
        • Dict[타입, 타입] 지원. (와일드카드 식? 그리고 JSON Key:Value 제약을 벗어난 형변환도 한다함) 
        • pydantic 의 각종 특수타입(HttpUrl, ... ) 지원.
        • 파이썬 의 각종 별도타입(UUID, datetime, frozenset, bytes, Decimal, ... ) 지원
        • ...
        • Update replacing with PUT
          • ...
        • Partial updates with PATCH
          • ...
        • ...
      • Cookie
        • Path 및 Query 와 마찬가지로~ 선언을 하고 사용을 하면 됨.
        • bake? crack? (string, domain, path, maxAge, ...)
      • Header
        • Path 및 Query 와 마찬가지로~ 선언을 하고 사용을 하면 됨.
        • User-Agent 같은, 하이픈(-) 자동변환 지원. (convert_underscores)
        • (헤더의 언더스코어(_) 를 허용하지 않는 HTTP Proxy 도 있음...)
        • 중복 헤더값 -> 모아 -> 리스트 으로 제공 가능.
      • Form / File
        • HTML <form> 방식의 인코딩 데이터 (application/x-www-form-urlencoded) 를 받을 수 있음.
          • 특정 OAuth2 스펙상 "username/password" 를 form 방식으로 전송 함.
        • HTML <form> 방식을 기반으로, 파일 데이터 (multipart/form-data) 를 받을 수 있음.
          • bytes 변수 : 작은 크기에 적합. (제한된 메모리에 저장)
          • UploadFile 변수 : 스풀파일(메모리+디스크), 메타, ... 각종 편의기능 제공.   
          • 한번에 여러게 파일 업로드도... 표준 OpenAPI 스펙상 가능은 함. (Swagger UI 에서는 지원안함)
    • Response
      • @라우터.메소드("경로", ... ) 에 response_model= 를 추가하여 선언 가능.
      • DB Obj 등의 dict 를 -> response_model 기반 -> 제약 및 직열화
      • response_model_include 혹은 response_model_exclude : set() 으로 지정.
        • response_model_exclude_unset : 없는것은 뻄
        • response_model_exclude_defaults : 없는건 디폴트값
        • response_model_exclude_none : 없는것 null
      • 클래스 타입, List[타입], Dict[타입, 타입] 등등 지원.
      • cookie : 
      • header : 
      • status_code : int 혹은 http.HTTPStatus 혹은 fastapi.status.{변수} 사용
    • Handling Errors
      • HTTPException(status_code=, detail=, headers=, ...) 식으로, 특정한 에러 응답을 처리 할 수 있음.
      • @app.exception_handler(RequestValidationError) 식으로, 특정한 에러 를 처리 할 수 있음.
      • ...
    • Dependencies (DI)
      • ...
      • Dependencies with yield
        • DI 차원에서, return 대신 yield 를 씀으로써~ 'extra steps after finishing' 를 지원함.
        • 예) 'def' 혹은 'async def' 함수 각각 알아서 DI 해준다
          • async def init_db():
            • db = DBSession()
            • try:
              • yield db
            • fisish:
              • db.close()
        • (위 코드상 발생하는 모든 해당 세션의 "except Exception:" 을 잡을 수 도 있음)
        • 파이썬 @contextlib .contextmanager 및 .asynccontextmanager 을 데코레이트한 함수로 동작.
        • 예) Context Managers 클래스
    • Security
      • "OAuth2" 의 (인증 및 인가를 다루는 방법을 정으한 스펙) '3rd 파티 로그인' 을 포함한 보안 제공.
      • ("OAuth1" 은 암호화된 통신을 직접 스펙화 하는 등등으로 매우 복잡해서 잘안씀...) 
      • "OpenID Connect" 는 OAuth2 기반으로 모호한점을 더 명확히 확장시켜~ 상호운영성을 높임.
      • ("OpenID" 는 OAuth2 기반이 아닌 방식으로 개발이 되었는데... 잘안씀...)
      • OpenAPI (스웨거라 불린~ APIs 를 빌딩하는 표준스팩)
        • 여러 '보안 스키마' 를 정의하는 방법이 있고, 이를 이용해 해당 표준스펙을 따르는 툴을 쉽게 연동.
      • security schemes
        • apiKey : 요청으로부터 받는 키값.
        • http : bearer 토큰, Basic 인증, HTTP Digest, ...
        • oauth2 : 보안을 다루는 모든 flow, 
          • Integrating other 인증/인가 providers like Google, Facebook, Twitter, GitHub, etc.
        • openIdConnect : ...
      •  이런 보안 메커니즘에 필요한 다양한 기능을 "fastapi.security 모듈" 로 제공 함.
      • ...
    • Middleware
      • 모든 request 직전 및 response 직전에 작동하는 함수를 설정 할 수 있도록 제공. 
      • @app.middleware("http") 식으로, 특정한 로직을 처리 할 수 있음.
    •  CORS
      • frontend -> origin (protocol+domain+port) 이 다른 backend 과 통신을 하기위한 설정.
        • 브라우져 : Req HTTP Option -> 백엔드 : Res HTTP Header (allow)
        • 브라우져 : 허용 -> 프론트엔드 : Req HTTP -> 백엔드 : Res HTTP
      • 예) app.add_middleware(CORSMiddleware, allow_origins=, ... )
      • HTTP Option 요청의 헤더에 따라~ CORSMiddleware 이 알아서 중계를 함.
    • Background Tasks
      • 간단한 넌블락 비동기 작업을 정의 할 수 있음. (선응답 후처리)
      • 예) fastapi.BackgroundTasks .add_task(함수, 인자, ...)
    • JSON 호환 Encoder
      • fastapi.encoders.jsonable_encoder 제공됨
      • Pydantic BaseModel 을 손쉽게 변환 -> 파이선 표준 json.dump() 으로 호환 가능.
    • Metadata and Docs URLs
      • include_in_schema=False
    • Static Files
      • ...
    • Test
      • ...
    • Debug
      • ...
  • Learn - FastAPI CLI 
    • "FastAPI CLI" : uses Uvicorn, a high-performance, production-ready, ASGI server. 
    • `fastapi dev` : dev 모드 (auto-reload=O, 127.0.01 리스닝, ...)
    • `fastapi run` : prd 모드 (auto-reload=X, 0.0.00 리스닝, ... )
      • % 보통 HTTPS 를 처리하는 "tls termination proxy" 가 있고, 배포환경 provider가 처리해주거나, 직접해야할수도있음!
  • Learn - Deployment
    • HTTPS 란? : https://howhttps.works
      • ...
    • ASGI 란?
      • FastAPI = ASGI web framework Application.
      • Uvicorn = ASGI 서버 프로그램.
    • 배포시 검토 해야할 주요 개념들
      • HTTPS : ...
      • Running on startup & Restarts : ...
      • The number of processes running
        • 하나의 HTTP Port 를 바라보는 Single Process -> Multiple Processes 
        • 즉, 동일한 Worker 프로그램을 여러게 띄워서 운영.
      • Memory : Workers 간에는 독립적인 메모리 관리.
      • Previous steps before starting : ...
    • Server Workers - Uvicorn with Workers
      • fastapi 명령어 예시) fastapi run app/main.py --app my_app --host 0.0.0.0 --port 8080 --workers 2
      • uvicorn 명령어 예시) uvicorn app.main:my_app --host 0.0.0.0 --port 8080 --workers 2 --log-level=debug
    • FastAPI in Containers - Docker
      • Dockerfile
        • FROM python:3.9
          
          WORKDIR /code
          # 현재 작업 디렉토리 지정
          
          COPY ./requirements.txt /code/requirements.txt
          
          RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
          # --no-cache-dir : pip가 다운로드한 패키지를 로컬에 저장하지 않도록 하는 옵션.
          # --upgrade : 패키지가 이미 설치되어 있는 경우 pip에 패키지를 업그레이드 하도록 하는 옵션.
          
          COPY ./app /code/app
          
          CMD ["fastapi", "run", "app/main.py", "--port", "80"]
        • CMD
      • (컨테이너로) 배포시 검코 해야할 주요 개념들 다시 보기
        • HTTPS : Nginx, Traefik 등으로 손쉽게 도입하거나... 클라우드 provider 가 지원 해줄수도있음.
        • Running on startup & Restarts : ...
        • The number of processes running :
          • ...
        • Memory : 
          • ...
        • Previous steps before starting :
          • ...
        • % 공식적으로 쓰던 FastAPI Docker Image "tiangolo/uvicorn-gunicorn-fastapi" 는 deprecated 됨!
          • FastAPI Docker Image 는 Uvicorn이 죽은 워커를 관리하고 재시작하는 것을 지원하지 않을 때 만들어짐.
          • 그래서 Gunicorn을 Uvicorn과 함께 사용해야 했고...
          • 그래서 Gunicorn이 Uvicorn의 워커를 관리하고, 재시작 하기만 하는것도 존나 복잡했었음...
          • 하지만 이제 Uvicorn이 --workers 를 지원하기 때문에~ FastAPI Docker Image 를 쓸이유가 없음!

-끝-

'랭귀지&프레임웤' 카테고리의 다른 글

Python DI  (0) 2022.09.04
FastAPI 심화  (0) 2022.09.04
"certificate verify failed: unable to get local issuer certificate"  (0) 2021.05.30
Python 이란?  (0) 2019.11.06
STS 개발  (0) 2019.11.06

+ Recent posts