본문 바로가기

Python

Pydantic: Settings with BaseSettings # .env

728x90
반응형

Pydantinc에서 제공하는 pydantic_settings.BaseSettings를 통해서, 환경설정 값들을 정할 수 있는데.

.env 파일이 없거나,

개발환경에서만 쓰이거나 개인 프로젝트에서만 쓰이는 .env 파일 안에 있지 않은, 개별적인 설정 값들을 사용할 때 유용하게 쓸 수 있다.

 

설치: 

pip install pydantic-settings

 

 

아래와 같이 settings.py와 .env 파일이 있다고 하자.

# settings.py

from pydantic_settings import BaseSettings

class Settings(BaseSettings):

    ATTR_1 = "a"
    ATTR_2 = "b"

 

# .env

ATTR_1 = "C"

 

프로그램 실행시 Settings의 ATTR_1 값은 "C", ATTR_@ 값은 "b"가 된다.

환경설정에서 지정한 값이 있을 시에는 오버라이딩을 하고, 

없을시에는 Settings에 선언한 값을 그대로 사용한다.

 

이와 같은 방식으로, 개발환경과 프로덕션환경에서 공통으로 사용할 값을 .env에 넣고 (보안과 관련된 부분이나)

개별적으로 사용할 값들은 class Settings(BaseSettings)안에 두어서 사용할 수 있다.

 

.env 파일 외에 어떤 파일을 환경변수 파일로 사용할 지 등을 정하는 방법으로 model_config = SettingsConfigDict를 사용하는 방법도 있다.

아래 예시 코드를 남겨두겠다.

from pydantic_settings import BaseSettings, SettingsConfigDict


class ApiSettings(BaseSettings):
    # 읽어올 .env 파일의 설정을 선언
    model_config = SettingsConfigDict(
        env_file='.env',
        env_file_encoding='utf-8',
        extra='ignore',  # extra=forbid (default)
        frozen=True  # 값을 변경할 수 없도록 설정
    )

    API_VERSION: str = "v1"

    AUTH_ALGORITHM: str = "HS256"
    AUTH_ISSUER: str = "g6_rest_api"
    AUTH_AUDIENCE: str = "g6_rest_api"

    ACCESS_TOKEN_EXPIRE_MINUTES: float = 1
    REFRESH_TOKEN_EXPIRE_MINUTES: float = 2
   
    ACCESS_TOKEN_SECRET_KEY: str = "access_token_secret_key"
    REFRESH_TOKEN_SECRET_KEY: str = "refresh_token_secret_key"


api_settings = ApiSettings()

 

 

** 문제 상황

python 파일이 아닌 .env 파일을 통해서 값을 불러오는 과정에서, .env와 python 파일 내에 모두 값을 설정해주거나 지웠는데도 변경전 값이 남아있는 경우가 있다. 마치 캐시가 된 것처럼..

.env 파일 등에서 값을 불러오는 방식에 따라 다르겠지만,

  dotenv의 load_dotenv를 사용하는 경우 

  from dotenv import load_dotenv
  
  load_dotenv(override=True)

 

위와 같은 옵션 설정을 통해서, 환경설정에서 불러오려는 값이 이미 있는 경우, 오버라이딩을 할 수 있도록 해주면 된다.

그 외 다른 라이브러리 등을 사용하는 경우에도 이와 같은 방식을 적용해 볼 수 있을 것이다.

 

문제 상황 예시 이슈 링크: https://github.com/gnuboard/g6/issues/607

 

공식문서:

https://docs.pydantic.dev/latest/concepts/pydantic_settings/

728x90
반응형