我正在处理多个 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
规则进行正确验证。
您可以通过编写一个功能验证器来实现这一点,如下所示:
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