如何在Pydantic BaseSettings中配置allowed_hosts为字符串列表?
解决Pydantic Settings中allowed_hosts转为字符串列表的问题
要将allowed_hosts设置为字符串列表并解决解析报错,可按以下几种方式实现:
方法一:利用默认逗号分隔解析
Pydantic Settings 默认支持将逗号分隔的环境变量字符串自动解析为列表,只需正确定义字段类型并配置环境变量即可:
- 导入必要类型并修改字段定义:
from typing import List from pydantic_settings import BaseSettings class EnvSettings(BaseSettings): debug: bool = False secret_key: str allowed_hosts: List[str] # 改为列表类型 db_name: str db_user: str db_password: str db_host: str db_port: str minio_endpoint: str minio_access_key: str minio_secret_key: str minio_use_https: bool = False minio_media_bucket_name: str minio_static_bucket_name: str minio_media_url: str minio_static_url: str celery_broker_url: str celery_task_default_queue: str = 'default'
- 配置环境变量(或
.env文件):
将ALLOWED_HOSTS设置为逗号分隔的字符串,例如:
ALLOWED_HOSTS=localhost,127.0.0.1,example.com
方法二:自定义解析逻辑(支持其他分隔符)
如果需要用逗号以外的分隔符(比如空格、分号),可以通过validator自定义解析规则:
from typing import List from pydantic import validator from pydantic_settings import BaseSettings class EnvSettings(BaseSettings): debug: bool = False secret_key: str allowed_hosts: List[str] db_name: str db_user: str db_password: str db_host: str db_port: str minio_endpoint: str minio_access_key: str minio_secret_key: str minio_use_https: bool = False minio_media_bucket_name: str minio_static_bucket_name: str minio_media_url: str minio_static_url: str celery_broker_url: str celery_task_default_queue: str = 'default' @validator('allowed_hosts', pre=True) def split_hosts(cls, value): # 如果输入是字符串,按逗号分割并去除首尾空格 if isinstance(value, str): return [host.strip() for host in value.split(',')] # 非字符串类型直接返回(比如已是列表的情况) return value
报错原因说明
你遇到的SettingsError是因为当字段定义为List[str]时,Pydantic Settings 无法直接将环境变量中的原始字符串转换为列表类型,必须明确告诉它如何完成字符串到列表的解析转换。
内容的提问来源于stack exchange,提问作者Ali Joghataee
相关产品推荐
相关产品推荐

