Introducción
Los desarrolladores trabajan en aplicaciones que se supone que deben implementarse en algún servidor para permitir que cualquiera use ellas. Por lo general, en la máquina donde viven estas aplicaciones, los desarrolladores configuran variables de entorno que permiten que la aplicación se ejecute. Estas variables pueden ser claves API de servicios externos, URL de su base de datos y mucho más.
Sin embargo, para el desarrollo local, es realmente inconveniente declarar estas variables en la máquina porque es un proceso lento y desordenado. Así que me gustaría compartir este breve tutorial cómo usar Pydantico para manejar las variables de entorno de manera segura.
.env archivo
Lo que comúnmente haces en un Pitón El proyecto es almacenar todas sus variables de entorno en un archivo llamado .env. Este es un archivo de texto que contiene todas las variables en un key : value formato. Puede usar también el valor de una de las variables para declarar una de las otras variables aprovechando el {} sintaxis.
El siguiente es un ejemplo:
#.env file
OPENAI_API_KEY="sk-your private key"
OPENAI_MODEL_ID="gpt-4o-mini"
# Development settings
DOMAIN=example.org
ADMIN_EMAIL=admin@${DOMAIN}
WANDB_API_KEY="your-private-key"
WANDB_PROJECT="myproject"
WANDB_ENTITY="my-entity"
SERPAPI_KEY= "your-api-key"
PERPLEXITY_TOKEN = "your-api-token"
Tenga en cuenta que el archivo .env debe permanecer privado, por lo que es importante que este archivo se mencione en su .gitignore Archivo, para asegurarse de que Nunca lo empuje en Githubde lo contrario, otros desarrolladores podrían robar sus llaves y usar las herramientas que ha pagado.
Env.example archivo
Para aliviar la vida de los desarrolladores que clonarán su repositorio, puede incluir un archivo envamosado en su proyecto. Este es un archivo que contiene solo las claves de lo que se supone que debe entrar en el archivo .env. De esta manera, otras personas saben qué API, fichas o secretos en general necesitan establecer para que los scripts funcionen.
#env.example
OPENAI_API_KEY=""
OPENAI_MODEL_ID=""
DOMAIN=""
ADMIN_EMAIL=""
WANDB_API_KEY=""
WANDB_PROJECT=""
WANDB_ENTITY=""
SERPAPI_KEY= ""
PERPLEXITY_TOKEN = ""
Python-Dotenv es la biblioteca que usa para cargar las variables declaradas en el archivo .env. Para instalar esta biblioteca:
pip install python-dotenv
Ahora puede usar load_dotenv para cargar las variables. Luego obtenga una referencia a estas variables con el módulo OS.
import os
from dotenv import load_dotenv
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
OPENAI_MODEL_ID = os.getenv('OPENAI_MODEL_ID')
Este método primero buscará su archivo .env para cargar las variables que ha declarado allí. Si este archivo no existe, la variable se tomará de la máquina host. Esto significa que puede usar el archivo .env para su desarrollo local, pero luego, cuando el código se implementa en un entorno de host como una máquina virtual o un contenedor Docker, usamos directamente las variables de entorno definidas en el entorno de host.
Pydantico
Pydantic es una de las bibliotecas más utilizadas en Python para la validación de datos. También se usa para serializar y deserializar clases en JSON y VELVER. Genera automáticamente el esquema JSON, reduciendo la necesidad de gestión de esquemas manuales. También proporciona validación de datos incorporada, asegurando que los datos serializados se adhieran al formato esperado. Por último, se integra fácilmente con marcos web populares como Fastapi.
pydantic-settings es una característica pydantic necesaria para cargar y validar la configuración o las clases de configuración de las variables de entorno.
!pip install pydantic-settings
Vamos a crear una clase llamada Settings. Esta clase heredará BaseSettings. Esto hace que los comportamientos predeterminados de determinar los valores de cualquier campo se lean desde el archivo .env. Si no se encuentra ningún var en el archivo .env, se usará el valor predeterminado si se proporciona.
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import (
AliasChoices,
Field,
RedisDsn,
)
class Settings(BaseSettings):
auth_key: str = Field(validation_alias="my_auth_key")
api_key: str = Field(alias="my_api_key")
redis_dsn: RedisDsn = Field(
'redis://user:pass@localhost:6379/1', #default value
validation_alias=AliasChoices('service_redis_dsn', 'redis_url'),
)
model_config = SettingsConfigDict(env_prefix='my_prefix_')
En el Settings Clase anterior Hemos definido varios campos. El Field La clase se usa para proporcionar información adicional sobre un atributo.
En nuestro caso, configuramos un validation_alias. Entonces, el nombre de la variable para buscar en el archivo .env se anula. En el caso informado anteriormente, la variable de entorno my_auth_key se leerá en lugar de auth_key.
También puede tener múltiples alias para buscar en el archivo .env que puede especificar aprovechando AliasChoises(choise1, choise2).
El último atributo model_config contiene todas las variables con respecto a un tema particular (por ejemplo, conexión a un DB). Y esta variable almacenará todo .env var que comienzan con el prefijo env_prefix.
Instanciar y usar configuraciones
El siguiente paso sería realmente instanciar y usar estas configuraciones en su proyecto Python.
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import (
AliasChoices,
Field,
RedisDsn,
)
class Settings(BaseSettings):
auth_key: str = Field(validation_alias="my_auth_key")
api_key: str = Field(alias="my_api_key")
redis_dsn: RedisDsn = Field(
'redis://user:pass@localhost:6379/1', #default value
validation_alias=AliasChoices('service_redis_dsn', 'redis_url'),
)
model_config = SettingsConfigDict(env_prefix='my_prefix_')
# create immediately a settings object
settings = Settings()
Ahora, ¿qué utiliza la configuración en otras partes de nuestra base de código?
from Settings import settings
print(settings.auth_key)
Finalmente tiene un fácil acceso a su configuración, y Pydantic lo ayuda a validar que los secretos tienen el formato correcto. Para obtener consejos de validación más avanzados, consulte la documentación pydántica: https://docs.pydantic.dev/latest/
Pensamientos finales
Administrar la configuración de un proyecto es una parte aburrida pero importante del desarrollo de software. Secretos como las teclas API, las conexiones DB son las que generalmente alimentan su aplicación. Ingenuamente, puede codificar estas variables en su código y aún funcionará, pero por razones obvias, esta no podría ser una buena práctica. En este artículo, le mostré una introducción sobre cómo usar la configuración de Pydantic para tener una forma estructurada y segura de manejar sus configuraciones.
💼 LinkedIn ️ | 🐦 X (Twitter) | 💻 Sitio web