首页 > 解决方案 > 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

谢谢!

标签: pythonvalidationflaskpost

解决方案


这是您的问题所在:

    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'}
        }
    })]

推荐阅读