0Pricing
FastAPI Backend Development Bootcamp · 课时

自定义数据类型与设置

定义自定义 Pydantic 数据类型,并使用 Pydantic 的 `BaseSettings` 管理应用设置。

自定义数据类型与设置 是 CoddyKit 上的免费 FastAPI Backend Development Bootcamp 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 FastAPI Backend Development Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 FastAPI Backend Development Bootcamp 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

Welcome to Custom Types!

Pydantic is great for validating data, but sometimes you need validation beyond its built-in types.

  • Custom Data Types let you define your own rules for data.
  • This ensures your data adheres to specific formats or business logic.
  • Think of it as extending Pydantic's power for unique needs.

`Annotated` for Custom Validation

Pydantic v2 uses Python's typing.Annotated alongside validator functions to create custom types.

  • Annotated: Adds metadata to a type hint.
  • BeforeValidator: Runs a function before Pydantic's standard validation.
  • This allows you to transform or validate input data before it's assigned.

Crafting a `CapitalizedString`

Let's create a custom type called CapitalizedString that ensures the first letter of a string is always uppercase.

Our validator function will check this rule. If the string isn't capitalized, it will raise an error.

Using Your Custom Type

Here's how to define and use our new CapitalizedString type in a Pydantic model. Try changing the name to start with a lowercase letter to see the validation error!

from typing import Annotated
from pydantic import BaseModel, BeforeValidator, ValidationError

def validate_capitalized(v: str) -> str:
    if not isinstance(v, str):
        raise TypeError("String required")
    if v and not v[0].isupper():
        raise ValueError("Must start with uppercase")
    return v

CapitalizedString = Annotated[str, BeforeValidator(validate_capitalized)]

class Product(BaseModel):
    name: CapitalizedString
    price: float

if __name__ == "__main__":
    try:
        product1 = Product(name="Laptop", price=1200.50)
        print(f"Product: {product1.name}")

        # This will raise a ValidationError
        # product2 = Product(name="keyboard", price=75.00)
    except ValidationError as e:
        print(f"Validation Error: {e}")

Manage Settings with `BaseSettings`

Application settings (like database URLs, API keys) often change between development and production environments.

BaseSettings, from pydantic-settings, is designed to manage these configurations easily. It automatically loads settings from:

  • Environment variables
  • .env files
  • Default values

Default Settings in Action

Define your settings as attributes in a class inheriting from BaseSettings. Pydantic handles the rest, providing default values if nothing else is specified.

from pydantic_settings import BaseSettings

class AppConfig(BaseSettings):
    app_name: str = "My FastAPI App"
    debug_mode: bool = False
    version: str = "1.0.0"

if __name__ == "__main__":
    settings = AppConfig()
    print(f"App Name: {settings.app_name}")
    print(f"Debug Mode: {settings.debug_mode}")
    print(f"Version: {settings.version}")

Loading from Environment Variables

BaseSettings automatically looks for environment variables that match your setting names (case-insensitive).

In this example, we temporarily set an environment variable to demonstrate how Pydantic picks it up, overriding the default.

import os
from pydantic_settings import BaseSettings

class AppConfig(BaseSettings):
    app_name: str = "Default App"
    database_url: str = "sqlite:///./test.db"

if __name__ == "__main__":
    print("--- Without env var ---")
    settings_default = AppConfig()
    print(f"App Name: {settings_default.app_name}")

    # Simulate setting an environment variable
    os.environ["APP_NAME"] = "Production App"
    os.environ["DATABASE_URL"] = "postgresql://user:pass@host:5432/db"

    print("\n--- With env var ---")
    settings_env = AppConfig()
    print(f"App Name: {settings_env.app_name}")
    print(f"DB URL: {settings_env.database_url}")

    # Clean up the environment variable for subsequent runs
    del os.environ["APP_NAME"]
    del os.environ["DATABASE_URL"]

Leveraging `.env` Files

For local development, it's common to store settings in a .env file (e.g., .env) in your project root.

You can configure BaseSettings to load from this file using SettingsConfigDict(env_file='.env') in your settings class.

Example .env content:
APP_NAME="Dev App"
API_KEY="your_dev_api_key"

from pydantic_settings import BaseSettings, SettingsConfigDict

class ProjectSettings(BaseSettings):
    model_config = SettingsConfigDict(env_file='.env', extra='ignore')

    app_name: str = "Default Project"
    api_key: str = "default_key"

# To make this runnable, you would need python-dotenv installed
# and an actual .env file in the same directory as the script.
# For this lesson, we show the setup.

# Example usage (if .env existed and python-dotenv was active):
# if __name__ == "__main__":
#     settings = ProjectSettings()
#     print(f"App Name: {settings.app_name}")
#     print(f"API Key: {settings.api_key}")

Understanding Settings Priority

When BaseSettings looks for a value, it follows a specific order of precedence:

  1. Environment variables (highest priority)
  2. .env file variables
  3. Default values defined in the BaseSettings class (lowest priority)

This ensures that environment variables can always override local .env files and class defaults, which is crucial for deployment.

Test Your Knowledge!

Which of the following are true about Pydantic's BaseSettings and custom types?

Recap: Custom Types & Settings

Great job! You've learned how to create powerful custom data types with Annotated and BeforeValidator, extending Pydantic's validation.

You also mastered BaseSettings for robust application configuration, understanding how it loads values from defaults, .env files, and environment variables with clear priority rules.

These tools are essential for building flexible and maintainable FastAPI applications!

常见问题解答

「自定义数据类型与设置」课时是免费的吗?

是的 — 「自定义数据类型与设置」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 FastAPI Backend Development Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 FastAPI Backend Development Bootcamp 课程共包含 4 节课。

「自定义数据类型与设置」这节课中我会学到什么?

定义自定义 Pydantic 数据类型,并使用 Pydantic 的 `BaseSettings` 管理应用设置。 你通过在浏览器中直接运行的动手代码来练习 FastAPI Backend Development Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 FastAPI Backend Development Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 FastAPI Backend Development Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「自定义数据类型与设置」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 FastAPI Backend Development Bootcamp 课中编写并运行代码吗?

能。每节 FastAPI Backend Development Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Pydantic 字段验证与验证器
  2. 自定义数据类型与设置
  3. 嵌套模型与递归结构
  4. 使用 model_dump 与别名进行序列化
← 返回 FastAPI Backend Development Bootcamp