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/
'Python' 카테고리의 다른 글
Python: script내의 argument(인자) 받는 함수 실행하기 # python -m script_path method args (0) | 2024.12.05 |
---|---|
Python: script 실행시 상위 경로 인식 못하는 문제 # -m option (0) | 2024.12.02 |
Python: name mangling 된 메소드 오버라이딩 # __method # (0) | 2024.05.28 |
Python: 동기, 비동기 함수 여부에 상관없이 실행하기 # inspect.iscoroutinefunction (0) | 2024.05.17 |
aiohttp: async requests code example (0) | 2024.05.13 |