首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证参数时webargs出现异常

验证参数时webargs出现异常
EN

Stack Overflow用户
提问于 2021-09-10 10:35:00
回答 1查看 71关注 0票数 0

最近我在使用webargs(8.0.1)和flask-restful(0.3.8)时遇到了一些问题。

当我尝试使用cURL http://127.0.0.1:5001/?score=100A时,异常抛出两次

我认为它应该使用函数handle_request_parsing_error返回一个jsonfy错误消息,但它只是返回HTTP500错误。

希望有人能帮我解决这个问题,谢谢!

代码语言:javascript
复制
from flask import Flask
from flask_restful import Api, Resource

from webargs import fields, validate
from webargs.flaskparser import use_args, use_kwargs, parser, abort

app = Flask(__name__)
api = Api(app)


class ScoreResource(Resource):
    """A welcome page."""

    score_args = {"score": fields.Int(required=True)}

    @use_args(score_args, location="query")
    def get(self, args):
        return {"message": "You score is {}!".format(args["score"])}


# This error handler is necessary for usage with Flask-RESTful
@parser.error_handler
def handle_request_parsing_error(err, req, schema):
    """webargs error handler that uses Flask-RESTful's abort function to return
    a JSON error response to the client.
    """
    abort(422, errors=err.messages)


if __name__ == "__main__":
    api.add_resource(ScoreResource, "/")
    app.run(port=5001, debug=True)
代码语言:javascript
复制
127.0.0.1 - - [10/Sep/2021 18:05:33] "GET /?score=100A HTTP/1.1" 500 -
Traceback (most recent call last):
  File "E:\projects\tools\venv\lib\site-packages\webargs\core.py", line 328, in parse
    data = schema.load(preprocessed_data, **load_kwargs)
  File "E:\projects\tools\venv\lib\site-packages\marshmallow\schema.py", line 720, in load
    data, many=many, partial=partial, unknown=unknown, postprocess=True
  File "E:\projects\tools\venv\lib\site-packages\marshmallow\schema.py", line 901, in _do_load
    raise exc
marshmallow.exceptions.ValidationError: {'score': ['Not a valid integer.']}
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "E:\projects\tools\venv\lib\site-packages\flask_restful\__init__.py", line 272, in error_router
    return original_handler(e)
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "E:\projects\tools\venv\lib\site-packages\flask\_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "E:\projects\tools\venv\lib\site-packages\flask_restful\__init__.py", line 272, in error_router
    return original_handler(e)
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "E:\projects\tools\venv\lib\site-packages\flask\_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "E:\projects\tools\venv\lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "E:\projects\tools\venv\lib\site-packages\flask_restful\__init__.py", line 468, in wrapper
    resp = resource(*args, **kwargs)
  File "E:\projects\tools\venv\lib\site-packages\flask\views.py", line 89, in view
    return self.dispatch_request(*args, **kwargs)
  File "E:\projects\tools\venv\lib\site-packages\flask_restful\__init__.py", line 583, in dispatch_request
    resp = meth(*args, **kwargs)
  File "E:\projects\tools\venv\lib\site-packages\webargs\core.py", line 445, in wrapper
    error_headers=error_headers,
  File "E:\projects\tools\venv\lib\site-packages\webargs\core.py", line 337, in parse
    error_headers=error_headers,
  File "E:\projects\tools\venv\lib\site-packages\webargs\core.py", line 236, in _on_validation_error
    error_headers=error_headers,
TypeError: handle_request_parsing_error() got an unexpected keyword argument 'error_status_code'
EN

回答 1

Stack Overflow用户

发布于 2021-09-10 19:12:43

您可以简单地注册一个flask错误处理程序,将错误格式化为json。

请查看文档中的Framework Support部分。

代码语言:javascript
复制
from flask import Flask
from flask import jsonify
from flask_restful import Api, Resource

from webargs import fields, validate
from webargs.flaskparser import use_args, use_kwargs, parser, abort

app = Flask(__name__)
api = Api(app)

class ScoreResource(Resource):
    """A welcome page."""

    score_args = {"score": fields.Int(required=True)}

    @use_args(score_args, location="query")
    def get(self, args):
        return {"message": "You score is {}!".format(args["score"])}

@app.errorhandler(422)
@app.errorhandler(400)
def handle_error(err):
    headers = err.data.get("headers", None)
    messages = err.data.get("messages", ["Invalid request."])
    if headers:
        return jsonify({"errors": messages}), err.code, headers
    else:
        return jsonify({"errors": messages}), err.code


if __name__ == "__main__":
    api.add_resource(ScoreResource, "/")
    app.run(port=5001, debug=True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69130929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档