我使用swagger编辑器(OpenApi 2)在python中创建flask api,当你在swagger中定义一个模型并将其用作请求主体的模式时,swagger会在将控制权交给你之前在X_controller.py文件中对主体进行验证。
我想在验证发生之前添加一些代码(用于打印日志以进行调试)。Swagger只会将如下错误打印到stdout,当您有很多字段时,这些错误就没有用了(我需要无效的键)。
https://host/path validation error: False is not of type 'string'
10.255.0.2 - - [20/May/2020:20:20:20 +0000] "POST /path HTTP/1.1" 400 116 "-" "GuzzleHttp/7"
我知道从技术上讲,你可以在swagger中删除验证,然后在你的代码中手动执行,但是我想继续使用这个特性,当它工作的时候,它是非常棒的。
欢迎您提出任何有关如何做到这一点的想法或任何能够记录请求的替代方案。
2条答案
按热度按时间webghufk1#
经过一段时间的研究,这就是我所学到的。
首先,让我们来看看如何用Swagger编辑器制作一个python-flask服务器。
Swagger Editor使用Swagger Editor中编写的定义通过Swagger Codegen生成服务器存根。codegen返回的这个服务器存根使用flask顶部的框架Connexion来处理所有的HTTP请求和响应,包括对swagger定义(swagger.yaml)的验证。
Connexion是一个框架,它使开发python-flask服务器变得很容易,因为它有很多功能,你必须使自己已经内置了,比如参数验证。我们所需要做的就是替换(在本例中是修改)这些connexion验证器。
有三个验证器:
默认情况下,它们被Map到flask,但是我们可以在
__main__.py
文件中轻松地替换它们,我们将看到。我们的目标是将默认日志和默认错误响应替换为一些自定义的日志和错误响应。我使用了一个自定义的
Error
模型和一个名为error_response()
的函数来准备错误响应,并使用Loguru来记录错误(不是强制性的,您可以保留原始的日志和错误响应)。为了进行所需的修改,查看connexion验证器代码,我们可以看到它的大部分都可以重用,我们只需要修改:
__call__()
和validate_schema()
__call__()
所以我们只需要创建两个新的类来扩展原来的类,并复制和修改那些函数。
复制和粘贴的时候要小心。这段代码基于connexion==1.1.15。如果你的版本不同,你的类应该以它为基础。
在新文件
custom_validators.py
中,我们需要:一旦我们有了验证器,我们必须使用validator_map将它们Map到flask应用(
__main__.py
):如果您还需要替换我在本例中没有使用的验证器,只需创建ResponseValidator的自定义子类,并在
__main__.py
中的validator_map字典中替换它。连接文档:https://connexion.readthedocs.io/en/latest/request.html
9fkzdhlc2#
请原谅我重复第一次发布在https://stackoverflow.com/a/73051652/1630244的答案
您尝试过Connexion
before_request
功能吗?下面是一个在Connexion验证正文之前记录标题和内容的示例: