简体   繁体   English

如何使用flask-restful中止未知参数?

[英]How to abort on unknown argument using flask-restful?

EDIT 编辑

This question is no longer relevant, since flask-restful new release can handle it by itself. 这个问题不再相关,因为烧瓶稳定的新发行版可以自行解决。

ORIGINAL QUESTION: 原始问题:

I have a flask-restful API, and I use reqparse in order to parse arguments. 我有一个烧瓶式的API,我使用reqparse来解析参数。 Now, I want to abort the request if the user uses an unknown argument. 现在,如果用户使用未知参数,我想中止请求。

Using reqparse, I can abort when I detect a known argument with a bad value, but it doesn't seem to have a default case where I could treat the others. 使用reqparse,我可以在检测到已知值不正确的参数时中止操作,但是似乎没有默认情况下可以处理其他参数。

It would prevent users to contact me with "why isn't it working ?" 这样可以防止用户通过“为什么不起作用?”与我联系。 when they are the one who are not using correct arguments. 当他们是不使用正确参数的人。

How would you do? 你会怎么做?

EDIT: As asked, here is an example of view: 编辑:根据要求,这是视图的示例:

class myView(restful.Resource):
    def get(self):
        parser = reqparse.RequestParser()
        parser.add_argument('arg1', type=str, action='append')
        parser.add_argument('arg2', type=myType, action='append')
        args = parser.parse_args()
        result = dao.getResult(arg1, arg2)
        return jsonify(result)

api.add_resource(myView, '/view')

What I want is this: If a user goes to ip/view?bad_arg=bad then they get a 400 error. 我想要的是:如果用户去ip/view?bad_arg=bad那么他们会收到400错误。

Beginning with 0.3.1, you can pass strict=True to reqparse.parse_args . 从0.3.1开始,您可以将strict=True传递给reqparse.parse_args https://github.com/flask-restful/flask-restful/pull/358 https://github.com/flask-restful/flask-restful/pull/358

reqparse does not provide a built in solution, but I was able to get over my problem by sub classing the reqparse parser. reqparse没有提供内置的解决方案,但是我可以通过对reqparse解析器进行子类化来解决我的问题。

class StrictParser(reqparse.RequestParser):

def parse_args(self, req=None):
    """Overide reqparse parser in order to fail on unknown argument
    """
    if req is None:
        req = request

    known_args = [arg.name for arg in self.args]
    for arg in request.args:
        if arg not in known_args:
            bad_arg = reqparse.Argument(arg)
            bad_arg.handle_validation_error("Unknown argument: %s" % arg)

    return reqparse.RequestParser.parse_args(self,req)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM