11import secrets
2+ import warnings
23from typing import Annotated , Any , Literal
34
45from pydantic import (
@@ -76,7 +77,7 @@ def SQLALCHEMY_DATABASE_URI(self) -> PostgresDsn:
7677 EMAILS_FROM_NAME : str | None = None
7778
7879 @model_validator (mode = "after" )
79- def set_default_emails_from (self ) -> Self :
80+ def _set_default_emails_from (self ) -> Self :
8081 if not self .EMAILS_FROM_NAME :
8182 self .EMAILS_FROM_NAME = self .PROJECT_NAME
8283 return self
@@ -95,5 +96,26 @@ def emails_enabled(self) -> bool:
9596 FIRST_SUPERUSER_PASSWORD : str
9697 USERS_OPEN_REGISTRATION : bool = False
9798
99+ def _check_default_secret (self , var_name : str , value : str | None ) -> None :
100+ if value == "changethis" :
101+ message = (
102+ f'The value of { var_name } is "changethis", '
103+ "for security, please change it, at least for deployments."
104+ )
105+ if self .ENVIRONMENT == "local" :
106+ warnings .warn (message , stacklevel = 1 )
107+ else :
108+ raise ValueError (message )
109+
110+ @model_validator (mode = "after" )
111+ def _enforce_non_default_secrets (self ) -> Self :
112+ self ._check_default_secret ("SECRET_KEY" , self .SECRET_KEY )
113+ self ._check_default_secret ("POSTGRES_PASSWORD" , self .POSTGRES_PASSWORD )
114+ self ._check_default_secret (
115+ "FIRST_SUPERUSER_PASSWORD" , self .FIRST_SUPERUSER_PASSWORD
116+ )
117+
118+ return self
119+
98120
99121settings = Settings () # type: ignore
0 commit comments