프레임워크/FastAPI

[FastAPI] FastAPI [12] Header Parameters

:) :) 2023. 4. 4. 23:10

https://fastapi.tiangolo.com/tutorial/header-params/

 

Header Parameters - FastAPI

You can define Header parameters the same way you define Query, Path and Cookie parameters. First import Header: Python 3.10+Python 3.9+Python 3.6+Python 3.10+ non-AnnotatedPython 3.6+ non-Annotated from typing import Annotated from fastapi import FastAPI,

fastapi.tiangolo.com

<FastAPI 공식문서 참조>

 

*Query, Path, Cookie parameter를 정의한 방식과 동일하게  Header  parameter를 정의 가능하다.

 

 

 

1. Import  Header 

 Header library를 import 하자.

from fastapi import FastAPI, Header

 

1-1. Declare  Header  parameter

헤더 매개변수 역시 Annotated를 이용해 편하게 선언 가능하다.

* Annotated는 python 3.9+ 에서 이용가능,

* 아래처럼 Union없이 선언하는 것은 python 3.10+ 이상에서만 가능

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):
    return {"User-Agent": user_agent}

 

2. Automatic conversion

 다른 것과는 다르게  Header  자료는 추가 기능을 제공한다.

바로 자동 형변환인다. 대부분의 표준 헤더는 "hyphen", "-" 기호로 구분이 되는데, 이는 파이썬에서 유효하지 않다.

따라서  Header 는 기본적으로 매개변수 이름을 언더스코어( _ )를 포함한 str에서 하이픈( - ) 로 변환해 헤더를 추출하고 기록해야 할 것이다.

 또한 HTML 헤더는 대소문자를 구분하지 않으므로, snake_case인 standard python style로 선언 가능하다.

따라서 헤더 선언 시  User_Agent  처럼 첫 문자를 대문자화 할 필요가 없고, python code 처럼  user_agent 로 사용한다.

 

이러한 기능은 on-off 가능하며,   Header   convert_underscores  False 로 설정하면 된다.

아래처럼 말이다.

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Union[str, None] = Header(default=None, convert_underscores=False)
):
    return {"strange_header": strange_header}

* 이렇게  convert_underscores 를  False 로 설정하면 자동 변환이 이루어지지 않고, 몇몇 HTTP 프록시와 서버들은 ( _ )가 포함된 헤더 형식을 허용하지 않는다는 점을 명심해야 한다.

 

 

 

3. Duplicate headers

  *헤더 중복사용.

 Python  list  를 사용해 여러 헤더를 한 번에 받을 수 있다.

 

@app.get("/items/")
async def read_items(x_token: Annotated[list[str] | None, Header()] = None):
    return {"X-Token values": x_token}

x_token을 Header형 list로 받았다.

이때 path operation은 아래같은 두 개의 HTTP header를 송신한다.

X-Token: foo
X-Token: bar

 

이에 대한 응답은 다음과 같다.

{
    "X-Token values": [
        "bar",
        "foo"
    ]
}

 

 

 

4. Reference

https://fastapi.tiangolo.com/tutorial/header-params/