跳转到主要内容

使用Pydantic管理Django设置。

项目描述

django-pydantic-settings

使用Pydantic设置管理简化Django设置配置。

这是一个仍在进行中的工作,但它读取标准的DJANGO_SETTINGS_MODULE环境变量(默认为pydantic_settings.settings.PydanticSettings),以加载pydantic_settings.Settings的子类。所有设置(在pydantic_settings.Settings中定义)都可以通过环境变量进行覆盖。使用特殊的DatabaseSettings类,可以通过DSN轻松配置多个数据库。

截至django-pydantic-settings 0.6.0版本,现在支持Django 4.0,但作为结果,Python 3.6和3.7的支持已取消。Python <3.8仍然可以使用版本0.5.0及以下版本,以及Django 3.2.x及以下版本;Python 3.6.0需要django-pydantic-settings <0.4.0。目前,django-pydantic-settings已在Python 3.8、3.9和3.10以及Django 2.2、3.0、3.1、3.2和4.0上进行测试。

安装 & 设置

安装django-pydantic-settings

pip install django-pydantic-settings

修改您的Django项目的manage.py文件以使用django-pydantic-settings,它应该看起来像这样

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import sys

from pydantic_settings import SetUp


def main():
    """Run administrative tasks."""
    SetUp().configure()

    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == "__main__":
    main()

您的wsgi.py和/或asgi.py文件也需要进行类似的修改,并看起来像这样

from django.core.wsgi import get_wsgi_application

from pydantic_settings import SetUp

SetUp().configure()
application = get_wsgi_application()

SetUp 类会自动查找标准的 DJANGO_SETTINGS_MODULE 环境变量,读取它,确认它指向一个存在的 Python 模块,然后加载该模块。您的 DJANGO_SETTINGS_MODULE 变量应该指向一个 pydantic_settings.settings.PydanticSettings 子类(尽管技术上任何定义了返回符合 Django 设置要求的 Python 字典的 dict() 方法的 Python 类都可以工作)。调用 configure() 方法后,将使用指定的模块来配置项目的 Django 设置。

如果您的项目使用一个包来指定多个不同的设置类,只需将 DJANGO_SETTINGS_MODULE 设置为您希望使用的设置类的完整路径。例如,给定以下目录结构

my_project/
├─ settings/
│  ├─ __init__.py
│  ├─ base.py
│  ├─ local.py
│  ├─ production.py
├─ my_app/

要使用 local.py 中的名为 MyLocal 的设置类,您应将您的 DJANGO_SETTINGS_MODULE 设置为 my_project.settings.local.MyLocal

必需的设置

要使用 django-pydantic-settings 与 Django 一起使用,无需配置任何设置。Django 所定义的所有可能设置(设置参考)都在 pydantic_settings.settings.PydanticSettings 类中配置,使用 Django 提供的正常默认值或合理的计算值。值得考虑的设置有 ROOT_URLCONFWSGI_APPLICATION,除非另行指定,否则将根据您的 DJANGO_SETTINGS_MODULE 进行计算,假设您正在使用由 django-admin.py startproject 提供的默认 Django 项目布局。例如,如果您的 DJANGO_SETINGS_MODULE 设置为 my_awesome_project.settings.PydanticSettingsSubclass,那么 ROOT_URLCONFWSGI_APPLICATION 将分别设置为 my_awesome_project.urlsmy_awesome_project.wsgi。此默认行为可以通过在您的 PydanticSettings 子类中指定 ROOT_URLCONF:str = 'the_actual_urlconf'WSGI_APPLICATION:str = 'the_actual_wsgi_file.application' 来覆盖。或者,您也可以设置 BASE_DIR,这将用于代替 DJANGO_SETTINGS_MODULE

另一个值得考虑的设置是 SECRET_KEY。默认情况下,SECRET_KEY 使用 Django 自身的 get_random_secret_key() 函数自动生成。这将正常运行,但是因为它会在每次 PydanticSettings 子类实例化时重新计算,所以如果您使用 Django 的认证并且不希望在服务器重启时丢失会话,则应将其设置为静态值。

数据库配置

默认数据库配置可以通过名为 DATABASE_URL 的环境变量进行配置,其中包含 DSN(数据源名称)字符串。

支持从 Google Cloud Run 内部连接到 Google Cloud SQL 数据库;DatabaseDsn 类型将检测并自动转义形式为 postgres://username:password@/cloudsql/project:region:instance/database 的 DSN 字符串,以便可以正确处理。

或者,您可以使用 DATABASES 设置(在 PydanticSettings 子类或通过 DJANGO_DATABASES 环境变量中)一次性设置所有数据库。

def MySettings(PydanticSettings):
    DATABASES = {"default": "sqlite:///db.sqlite3"}  # type: ignore

还可以使用具有指向 DATABASES 字典中数据库别名的 configure_database 参数的 Field 以与默认的 DATABASE_URL 配置相同的方式通过环境变量配置额外的数据库连接。

from pydantic_settings import PydanticSettings
from pydantic_settings.database import DatabaseDsn


def MySettings(PydanticSettings):
    secondary_database_dsn: Optional[DatabaseDsn] = Field(
        env="SECONDARY_DATABASE_URL", configure_database="secondary"
    )

例如,settings_test/database_settings.py 文件具有以下配置的设置子类,并在直接运行时输出对 DATABASES 设置的更改。

❯ DATABASE_URL=postgres://username:password@/cloudsql/project:region:instance/database SECONDARY_DATABASE_URL=sqlite:///foo python settings_test/database_settings.py
{'default': {'ENGINE': 'django.db.backends.postgresql',
             'HOST': '/cloudsql/project:region:instance',
             'NAME': 'database',
             'PASSWORD': 'password',
             'USER': 'username'},
 'secondary': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'foo'}}

Sentry 配置

django-pydantic-settings 为 Django 项目配置使用 Sentry 提供了内置功能。使用它的最简单方法是继承自 pydantic_settings.sentry.SentrySettings 而不是 pydantic_settings.settings.PydanticSettings。这会添加 SENTRY_DSN 设置,它使用 pydantic_settings.sentry.SentryDsn 类型。这将自动根据 DJANGO_SENTRY_DSN 环境变量进行设置,并期望一个 Sentry DSN(显然)。它验证提供的 DSN 是一个有效的 URL,然后自动使用内置的 DjangoIntegration 初始化 Sentry SDK。使用此功能需要安装 sentry-sdk,如果安装了 django-pydantic-settings[sentry],则会自动包含它。

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

django-pydantic-settings-0.7.0.tar.gz (14.9 kB 查看哈希)

上传时间 源代码

构建分发

django_pydantic_settings-0.7.0-py3-none-any.whl (13.7 kB 查看哈希)

上传时间 Python 3

由以下机构支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF 赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面