python - python中的异常错误:'TypeError:o不是有效的验证器,因为它不可调用'
问题描述
当我使用 Postman 发出 ("{url}/posts/") 的 POST 请求时,它运行下面的 add_post 方法,我收到一个我以前从未见过的奇怪错误:
'TypeError: o 不是有效的验证器,因为它不可调用'
我正在尝试验证请求 json,我非常有信心这是错误出现的地方,因为在我尝试验证之前一切正常。我正在尝试使用 flask_inputs 来验证请求,并且我准确地复制了几个在线文档。但是,这会导致我上面提到的错误,我不知道为什么。任何建议都有帮助!
import json
from flask import Flask
from flask import jsonify
from flask import request
from flask_inputs import Inputs
from flask_inputs.validators import JsonSchema
app = Flask(__name__)
post_data = dict()
post_counter = 0
@app.route("/posts/", methods=["POST"])
def add_post():
global post_counter
check = PostCheck(request)
if not check.validate():
return json.dumps({"success": False, "errors": check.errors})
body = json.loads(request.data)
title = body.get("title")
username = body.get("username")
data = {
"id": post_counter,
"title": title,
"username": username
}
post_data[post_counter] = data
post_counter += 1
return json.dumps({"success": True, "data": data}), 200
class PostCheck(Inputs):
validation_schema = {
"type": "object",
"properties": {
"title": {"type": "string"},
"username": {"type": "string"}
}
}
json = [JsonSchema(schema={"type":"object"})]
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
以下是完整的追溯:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/serge/Documents/AppDev/Learn/backend/pa1/src/app.py", line 79, in add_post
check = PostCheck(request)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/flask_inputs/inputs.py", line 36, in __init__
fields[field] = Field(validators=validators)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/wtforms/fields/core.py", line 43, in __new__
return UnboundField(cls, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/wtforms/fields/core.py", line 365, in __init__
self.field_class.check_validators(validators)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/wtforms/fields/core.py", line 167, in check_validators
raise TypeError("{} is not a valid validator because it is not "
TypeError: o is not a valid validator because it is not callable
谢谢!
解决方案
这是您的问题所在:
validation_schema = {
"type": "object",
"properties": {
"title": {"type": "string"},
"username": {"type": "string"}
}
}
即使您没有使用它,它仍然是一个类变量,并且 json_inputs 正在尝试将其用作验证器。需要明确的是,在 json_inputs 类上定义的所有类属性都应该是验证器。
因此,您需要执行以下操作之一:
validation_schema = {
"type": "object",
"properties": {
"title": {"type": "string"},
"username": {"type": "string"}
}
}
class PostCheck(Inputs):
json = [JsonSchema(schema={"type":"object"})]
或者
class PostCheck(Inputs):
json = [JsonSchema(schema={
'type': 'object',
'properties': {
'name': {'type': 'string'}
}
})]
推荐阅读
- php - PHP关联数组重新排序
- javascript - 是否可以以编程方式获取用户在生产中看到的客户端包大小?
- postgresql - Postgres查询按布尔标志对系列进行分组
- javascript - Typescript:在类型定义文件中导入其他类型
- swift - 为什么 UITextField 忽略设备上的“\n”字符,而不是故事板?
- webrtc - WebRtc C++ 库对等统计报告抖动
- ios - ios - 如何在iOS SpriteKit中的每个精灵之间延迟一个组的所有精灵?
- java - 键入 char 作为数字类型
- sql - 根据另一个 id 列更新具有(列组值的 max+1)列的脚本
- scheduled-tasks - PowerShell 计划任务失败并显示错误代码:0xFFFD0000 和 4294770688 如果每天每小时运行一次