POST 使用 Pydantic 和 Annotated 请求数据验证

问题描述 投票:0回答:1

我正在处理多个 POST API 请求,并且我有所有 POST API 的验证架构。我正在尝试验证来自 POST 请求的 URL 是否有效。我正在使用 Pytest 为所有 API 编写测试。

我正在尝试像这样验证传入的数据:

url: Annotated[str, HttpUrl]

我尝试向它发送几个无效的 url,但这里是一个 json 中的示例:

"url": "www.bad.example",

出于某种原因,无论如何,我使用上述方法都没有收到验证错误。我尝试咨询 ChatGPT 以及 Google,但是,我在任何地方都找不到这个问题的答案。

我尝试过同时使用

AnyUrl
HttpUrl
。我也尝试过:

url: Annotated[HttpUrl, ...]

它确实验证了无效的 URL,但它使我的积极测试失败并出现以下错误消息:

sqlalchemy.exc.ProgrammingError: (sqlite3.ProgrammingError) Error binding parameter 4: type 'pydantic_core._pydantic_core.Url' is not supported

因此,我希望坚持使用

str
类型,这不会导致此错误,但也不能真正使用
HttpUrl
规则进行正确验证。

python pytest python-typing pydantic
1个回答
0
投票

您可以通过编写一个功能验证器来实现这一点,如下所示:

from typing import Annotated

from pydantic import BaseModel, HttpUrl, AfterValidator

HttpStr = Annotated[HttpUrl, AfterValidator(str)]


class MyModel(BaseModel):
    url: HttpStr


m1 = MyModel(url="https://hello.com")
assert m1.url == "https://hello.com/"

m2 = MyModel(url="https://hello[.]com")  # raises ValidationError("Input should be a valid URL, invalid domain character")

在此示例中,我们利用

HttpUrl
带注释的类型,然后添加
AfterValidator
Url
强制回字符串。

但是,快速浏览一下 SQLAlchemy 文档,看起来这可能是有记录的解决方法的常见问题。这可能是解决您的特定问题的更优雅的方法?

经常需要强制更改类型的“字符串”版本,即在 CREATE TABLE 语句或其他 SQL 函数(如 CAST)中呈现的类型。

https://docs.sqlalchemy.org/en/20/core/custom_types.html#overriding-type-compilation

© www.soinside.com 2019 - 2024. All rights reserved.