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 에서는 지원안함)
- HTML <form> 방식의 인코딩 데이터 (application/x-www-form-urlencoded) 를 받을 수 있음.
- Path & Query '선언' 및 '타입' 및 '검증'
- 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()
- async def init_db():
- (위 코드상 발생하는 모든 해당 세션의 "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 이 알아서 중계를 함.
- frontend -> origin (protocol+domain+port) 이 다른 backend 과 통신을 하기위한 설정.
- 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
- ...
- Request
- 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
- Exec form (O) : FastAPI can shutdown gracefully and lifespan events are triggered.
- Shell form (X) : docker-compose 등에서 매우 느려지는 현상?
- Behind a "TLS Termination Proxy"
- Nginx, Traefik, 등등의 "TLS 종료 프록시 (로드 밸런서)" 뒤에 App 을 띄울경우!!
- --proxy-headers 옵션 으로~
- Uvicorn 에게, 프록시가 보낸 헤더를 신뢰하고, App 에 HTTPS 뒤에서 실행중 등을 알려줌.
-
- (컨테이너로) 배포시 검코 해야할 주요 개념들 다시 보기
- 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 를 쓸이유가 없음!
- Dockerfile
- HTTPS 란? : https://howhttps.works
-끝-
'랭귀지&프레임웤' 카테고리의 다른 글
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 |