728x90
반응형
1. FastAPI - 01 (FastAPI란?)
이론 링크: https://just-record.github.io/fastapi/fastapi-01/
from fastapi import FastAPI
app = FastAPI() # FastAPI의 인스턴스 객체 app를 생성.
@app.get("/") # 경로 동작 데코레이터 (url 주소)
async def root(): # 경로 동작 함수
return {"message": "Hello World"} # json Type으로 return
- 저번 시간에 사용했던 Flask랑 사용법이 비슷하다.(같은 웹 호스팅 모듈이라 그런 것 같다)
- cmd창에 curl -X GET \ http://localhost:8000/ 를 입력하면 호스팅한 값을 콘솔창에 띄운다.
- Path Parameters의 데이터 타입을 지정 할 수 있어 try-catch문으로 백엔드에서 데이터 타입을 따로 확인할 필요가 없어 편리하다.
1.1 서버 실행
- 명령 프롬프트 창에 'uvicorn main:app --reload' 를 입력한다.
uvicorn main:app --reload
- 입력하는 경로안에 main.py가 있어야한다. 만약에 경로에 없다면 명령 프롬프트 창에서 cd명령어로 파이썬 파일이 들어있는 디렉토리로 경로를 변경해주자.
- main은 파이썬 파일명으로 다른 이름으로 변경해도 되지만 띄어쓰기는 인식하지 못한다.
- 기본적으로 개발자는 파일명에 띄어쓰기는 사용하지 않고 언더바를 사용하는 것이 기본이다. (데이터 베이스는 대소문자를 구분하지 않으므로 낙타 표기법도 좋지 않다. 왠만하면 언더바를 사용한 표기법에 익숙해지자)
- app은 파이썬 파일 내에서 app 인스턴스를 FASTAPI의 객체로 생성했기 때문에 사용한 것으로, 다른 명칭으로 변경할 수 있다.
1.2 웹호스팅 주소
웹 브라우저의 주소창에 'http://127.0.0.1:8000'를 입력하면 FASTAPI의 app객체로 생성한 경로 동작함수 반환값이 보인다.
1.3 return 방식
FastAPI는 기본적으로 application/json 형태로 응답을 처리한다. 따라서 return을 하면 웹페이지에서 제이슨 형태가 텍스트로 출력된다.
HTML 콘텐츠를 올바르게 반환하려면 응답의 Content-Type을 text/html로 명시적으로 설정해야 한다. import를 해주면 FastAPI의 HTMLResponse를 사용할 수 있습니다.
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.get("/", response_class=HTMLResponse) # HTMLResponse로 응답 클래스를 지정
async def read_root():
# HTML 코드를 문자열로 반환
html_content = """
<html>
<head>
<title>Example Page</title>
<style>
h1 { color: red; }
p { color: blue; }
</style>
</head>
<body>
<h1>Hello, FastAPI!</h1>
<p>This is a simple HTML response with CSS.</p>
</body>
</html>
"""
return HTMLResponse(content=html_content)
- 조금 번거롭긴 하지만 java의 servlet보단 편하다.
- css와 Html 태그가 잘 적용된 것을 볼 수 있다.
1.4 서버 종료
- FastAPI서버를 종료하고 싶다면 uvicorn 명령어를 입력했던 명령 프롬프트 창에서 'Ctrl + c'키를 누르면 된다.
Ctrl + c
1.5 FastAPI의 강력한 대화형 문서
- 웹 브라우저 주소에 'http://127.0.0.1:8000/docs'를 입력하면 대화형 문서창이 나온다.
http://127.0.0.1:8000/docs
- Postman 어플리케이션 없이 post를 보내거나 변수를 입력하는 등 다양한 테스트를 할 수 있는 편의 기능을 제공한다.
2. FastAPI - Path Parameters
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int): # item_id는 int Type으로 변경 됨
return {"item_id": item_id}
Flask와 같이 중괄호로 Path Parameter를 사용할 수 있다.
콜론을 사용해 데이터 타입을 지정 할 수 있다. docs로 확인가능하고 다른 데이터 타입이 입력된다면 에러를 브라우저에 반환하므로 쉽게 잘못된 부분을 체크할 수 있다.(코드의 유지보수가 수훨하다)
3. FastAPI - Query 매개변수
- 매개변수가 URL의 쿼리 스트링으로 처리된다.
- URL에서 ‘?’ 뒤에 오는 부분은 ‘key=value’ 형식으로 구성된 쿼리 매개변수를 나타낸다.
- 각 쿼리 매개변수는 ‘&’로 구분된다.
http://127.0.0.1:8000/items/?skip=0&limit=10
- skip은 값이 0으로, limit는 값이 10으로 설정된 쿼리 매개변수가 된다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/") # 경로 매개변수가 없음
async def read_item(x1: int = 0, x2: int = 10):
return x1 + x2
http://127.0.0.1:8000/?x1=11&x2=22
이렇게 입력하면 x1값이 11으로, x2값이 22로 매개변수가 되어 return값 33이 웹 브라우저에 출력된다.
4. FastAPI - 04 (Request Body)
POST 요청은 데이터를 HTTP의 Request Body(요청의 본문)을 통해 전송한다. 3번의 Query 매개변수와 다른 방식의 전송 방법이다.
app = FastAPI()
x = 'Hello, world!'
@app.post("/") # POST 메소드
async def create_item(x): # 경로, 쿼리 매개변수와 같은 패턴
return x
- 브라우저에 Hello, wolrd!가 출력될 것 같지만 아니다.
- post방식은 HTML의 form 형식에서 submit으로 value값을 보내거나 Postman 어플로 post값을 보내거나, docs에서 값을 Execute하는 방법으로 보낼 수 있다.
- 따라서 이런 방식으로 return하는 것은 의미가 없고, 파이썬의 pydantic -Basemodel로 데이터 타입을 지정한 뒤, 해당 데이터를 post형식으로 받는데 사용한다.
- Pydantic으로 생성한 데이터는 클래스이므로 필드값이 key, value로 매칭되어 jason타입으로 반환 받을 수 있다.
5. Pydantic
- 이론 링크: https://just-record.github.io/python/python-pydantic/
- pydantic은 Python의 Type Annotations을 활용하여 데이터 유효성을 검사 하는 라이브러리입니다.
- 강제성은 없지만 데이터 타입을 명시하여 가독성을 높히고 오류를 미연에 방지할 수 있다.
# pydantic의 BaseModel을 상속하여 데이터 모델을 정의
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
email: str
is_active: bool = True
6. FastAPI - 05 (쿼리 매개변수와 문자열 유효성 검사)
- Annotated를 사용하여 쿼리 매개변수의 유효성 검사를 할 수 있습니다.
- Annotated는 어떤 데이터 데이터 타입을 매개변수로 받을지 지정하는데 사용된다.
- Query() 매개 변수로 데이터 타입 뿐만아니라 범위를 지정할 수 있다.
from typing import Union
from fastapi import FastAPI, Query # Query import
from typing_extensions import Annotated # Annotated import
# python 3.10
# from typing import Annotated
app = FastAPI()
@app.get("/items/")
# Query(max_length=50) - 쿼리 매개변수의 최대 길이를 50으로 지정
# Union[str, None]와 Query(max_length=50)을 Annotated로 묶음
# 기본값을 None으로 지정
async def read_items(q: Annotated[Union[str, None], Query(max_length=50)] = None):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
'Coding 공부 > Big data & Python' 카테고리의 다른 글
[Big data & Python] 딥러닝, 넘파이(numpy), 텐서플로우 케라스 예제(Tensorflow.kreras), 파이토치 예제(totch) (0) | 2024.05.11 |
---|---|
[Big data & Python] openAI API(API 키, 결제, 채팅 예제, 링크) (0) | 2024.05.07 |
[Big data & Python] Drawing_Star Mini Project ver 2.0 (0) | 2024.04.12 |
[Big data & Python] Drawing_Star Mini Project(python + Flask + HTML) (0) | 2024.04.11 |
[Bigdata & Python] Flask, PostgreSQL (2) | 2024.04.11 |
댓글