Post

FastAPI 공식문서 따라하기[15] - Header Parameters

https://fastapi.tiangolo.com/tutorial/header-params/ 공식문서 따라하는 글

☑️ Header Parameters

앞에서 QueryParameter, PathParameter, Cookie를 설정해준것처럼 Header를 설정할 수 있다.

☑️ Import Header

사용하기 위해선 fastapi에서 Header를 임포트 해야한다.

1
2
3
4
5
6
7
8
9
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(Host: str | None = Header(default=None)):
    return {"Host": Host}

개인적으로 확인할게 있어서 기본 예제를 바꿨다.

기본 예제에는 Host변수로 인자를 받는게 아니고, user_agent를 인자로 받는다.

위의 예제의 결과는

1
{"Host":"localhost:8000"}

이렇게 뜨고, user_agent를 인자로 받는다면

1
{"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"}

이렇게 내 정보가 뜬다.

HeaderPath,Query,Cookie처럼 Param클래스를 상속받았다고 한다.
하지만 리턴하는 값은 모두 다 같은 값이 아니라는 사실을 알고 있어야 한다.

☑️ Automatic conversion

보통 헤더에는 -기호로 구분을 한다. user-agent처럼 말이다. 그러나 이러한 -값이 포함되어 있으면 Python에서는 인식하지 못한다.

그렇기에 Header를 사용하면 -를 자동으로 _로 바꿔 인식한다.

또한 HTTPheader들은 대소문자를 구문하지 않으므로 표준Python스타일로 선언할 수 있다.

그렇기에 User_Agent같이 작성할 필요 없고 user_agent처럼 표준Python 명명규칙을 따를 수 있다.

파이썬 표준에 관해서는 여기를 참고 -> https://digital-play.tistory.com/46

만약 그래도 어떠한 이유때문에 -_로 바꿔주는 자동 변환 기능을 꺼버리고 싶다면 다음과 같이 convert_underscores의 값을 False로 주면 된다.

1
2
3
4
5
6
7
8
9
10
11
from fastapi import FastAPI, Header

app = FastAPI()


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

☑️ Duplicate headers

같은 헤더에 여러값이 있을때도 이를 받을 수 있다고 한다.

이렇게 받으려면 list형식으로 인자를 받아야 한다.

예를들면, Kms-Token이 있다고 하고 이에 여러값을 저장하여 받는다고 할 때

1
2
3
4
5
6
7
8
9
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(kms_token: list[str] | None = Header(default=None)):
    return {"Kms_Token value": kms_token}

이렇게 작성할 수 있고

1
2
3
4
5
6
curl -X 'GET' \
  'http://localhost:8000/items/' \
  -H 'accept: application/json' \
  -H 'kms-token: hi?' \
  -H 'kms-token: token2'

이렇게 요청을 보내 값을 확인할 수 있다.

This post is licensed under CC BY 4.0 by the author.