Add variants for `path-operation-advanced-configuration/tutorial007`

This commit is contained in:
Yurii Motov 2025-11-27 09:38:29 +01:00
parent 449c18e67e
commit 699cd287cb
3 changed files with 49 additions and 7 deletions

View File

@ -155,7 +155,7 @@ For example, in this application we don't use FastAPI's integrated functionality
//// tab | Pydantic v2
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[17:22, 24] *}
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[15:20, 22] *}
////
@ -179,7 +179,7 @@ And then in our code, we parse that YAML content directly, and then we are again
//// tab | Pydantic v2
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[26:33] *}
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[24:31] *}
////

View File

@ -0,0 +1,32 @@
import yaml
from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel, ValidationError
app = FastAPI()
class Item(BaseModel):
name: str
tags: list[str]
@app.post(
"/items/",
openapi_extra={
"requestBody": {
"content": {"application/x-yaml": {"schema": Item.model_json_schema()}},
"required": True,
},
},
)
async def create_item(request: Request):
raw_body = await request.body()
try:
data = yaml.safe_load(raw_body)
except yaml.YAMLError:
raise HTTPException(status_code=422, detail="Invalid YAML")
try:
item = Item.model_validate(data)
except ValidationError as e:
raise HTTPException(status_code=422, detail=e.errors(include_url=False))
return item

View File

@ -1,14 +1,24 @@
import importlib
import pytest
from fastapi.testclient import TestClient
from ...utils import needs_pydanticv2
from ...utils import needs_py39, needs_pydanticv2
@pytest.fixture(name="client")
def get_client():
from docs_src.path_operation_advanced_configuration.tutorial007 import app
@pytest.fixture(
name="client",
params=[
pytest.param("tutorial007"),
pytest.param("tutorial007_py39", marks=needs_py39),
],
)
def get_client(request: pytest.FixtureRequest):
mod = importlib.import_module(
f"docs_src.path_operation_advanced_configuration.{request.param}"
)
client = TestClient(app)
client = TestClient(mod.app)
return client