Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

flask.ext.restful -> reqparse

Tags:

python

rest

flask

I'm trying to use this reqparse to send meaningful validation back to my clients in a flask app. Here is the code:

class ParserTest(Resource):

    def get(self):
        parser = reqparse.RequestParser();
        parser.add_argument('not_sent_from_client', type=str, required=True,
                help='This field is required',
                location='form')
        args = parser.parse_args()
        return "ok"

restfulApi.add_resource(ParserTest, '/p')

When I curl -v http://localhost:5000/p I get this response:

* About to connect() to localhost port 5000 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 5000 (#0) GET /api/v1/p HTTP/1.1 User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5 Host: localhost:5000 Accept:
*/*

* HTTP 1.0, assume close after body < HTTP/1.0 400 BAD REQUEST < Content-Type: text/html < Content-Length: 192 < Server: Werkzeug/0.8.3 Python/2.7.1 < Date: Sat, 22 Dec 2012 22:21:33 GMT <  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>400 Bad Request</title> <h1>Bad Request</h1> <p>The browser (or proxy) sent a request that this server could not understand.</p>
* Closing connection #0

Where did the error message go?

When I change the code to this:

def get(self):
        try:
            parser = reqparse.RequestParser();
            parser.add_argument('not_sent_from_client', type=str, required=True,
                help='This field is required',
                location='form')
            args = parser.parse_args()
        except Exception as e:
            pprint.pprint(getmembers(e))
        return 'ok'

This gets dumped to stdout when I make a GET request...

[('__call__',   <bound method ClientDisconnected.__call__ of <ClientDisconnected '400: Bad Request'>>),  
('__class__', <class 'werkzeug.exceptions.ClientDisconnected'>),  
('__delattr__',   <method-wrapper '__delattr__' of ClientDisconnected object at 0x1065ca230>),  ('__dict__', {'data': {'message': 'This field is required'}}),  
('__doc__',   'Internal exception that is raised if Werkzeug detects a disconnected\n    client.  Since the client is already gone at that point attempting to\n    send the error message to the client might not work and might ultimately\n    result in another exception in the server.  Mainly this is here so that\n    it is silenced by default as far as Werkzeug is concerned.\n\n    Since disconnections cannot be reliably detected and are unspecified\n    by WSGI to a large extend this might or might not be raised if a client\n is gone.\n\n    .. versionadded:: 0.8\n    '),  ('__format__',   <built-in method __format__ of ClientDisconnected object at 0x1065ca230>),  ('__getattribute__',   <method-wrapper '__getattribute__' of ClientDisconnected object at 0x1065ca230>),  ('__getitem__',   <method-wrapper '__getitem__' of ClientDisconnected object at 0x1065ca230>),  ('__getslice__',   <method-wrapper '__getslice__' of ClientDisconnected object at 0x1065ca230>),  ('__hash__',   <method-wrapper '__hash__' of ClientDisconnected object at 0x1065ca230>),  ('__init__',   <bound method ClientDisconnected.__init__ of <ClientDisconnected '400: Bad Request'>>),  ('__module__', 'werkzeug.exceptions'),  ('__new__', <built-in method __new__ of type object at 0x105bd4570>),  ('__reduce__',   <built-in method __reduce__ of ClientDisconnected object at 0x1065ca230>),  ('__reduce_ex__',   <built-in method
__reduce_ex__ of ClientDisconnected object at 0x1065ca230>),  ('__repr__',   <bound method ClientDisconnected.__repr__ of <ClientDisconnected '400: Bad Request'>>),  ('__setattr__',   <method-wrapper '__setattr__' of ClientDisconnected object at 0x1065ca230>),  ('__setstate__',   <built-in method __setstate__ of ClientDisconnected object at 0x1065ca230>),  ('__sizeof__',   <built-in method __sizeof__ of ClientDisconnected object at 0x1065ca230>),  ('__str__',   <bound method ClientDisconnected.__str__ of <ClientDisconnected '400: Bad Request'>>),  ('__subclasshook__',   <built-in method __subclasshook__ of type object at 0x105da42c0>),  ('__unicode__',   <bound method ClientDisconnected.__unicode__ of <ClientDisconnected '400: Bad Request'>>),  ('__weakref__', None),  ('args', ('400 Bad Request',)),  ('code', 400),  ('data', {'message': 'This field is required'}),  ('description',   '<p>The browser (or proxy) sent a request that this server could not understand.</p>'),  ('get_body',   <bound method ClientDisconnected.get_body of <ClientDisconnected '400: Bad Request'>>),  ('get_description',   <bound method ClientDisconnected.get_description of <ClientDisconnected '400: Bad Request'>>),  ('get_headers',   <bound method ClientDisconnected.get_headers of <ClientDisconnected '400: Bad Request'>>),  ('get_response',   <bound method ClientDisconnected.get_response of <ClientDisconnected '400: Bad Request'>>),  ('message', '400 Bad Request'),  ('name', 'Bad Request'),  ('wrap',   <bound method type.wrap of <class 'werkzeug.exceptions.ClientDisconnected'>>)]

But "ok" gets sent to the client. So the client is disconnecting.

I want to use this to send back meaningful error messages to my apis clients but it seems like another error is happening in the call stack. Any ideas?

like image 293
fansonly Avatar asked Dec 22 '12 22:12

fansonly


People also ask

What is Reqparse in flask-RESTful?

With resources defined and everything connected with Blueprints, it's time to handle incoming arguments. Flask-RESTful provides a solid tool known as Reqparse for specifying and validating submitted data.

Is Reqparse deprecated?

reqparse has been deprecated (https://flask-restful.readthedocs.io/en/latest/reqparse.html): The whole request parser part of Flask-RESTful is slated for removal and will be replaced by documentation on how to integrate with other packages that do the input/output stuff better (such as marshmallow).

What is flask-RESTful API?

Flask-RESTful is an extension for Flask that adds support for quickly building REST APIs. It is a lightweight abstraction that works with your existing ORM/libraries. Flask-RESTful encourages best practices with minimal setup. If you are familiar with Flask, Flask-RESTful should be easy to pick up.

What is the difference between Flask and flask-RESTful?

Flask is a highly flexible Python web framework built with a small core and easy-to-extend philosophy. Flask-Restful is an extension of Flask that offers extension to enable writing a clean object-oriented code for fast API development.


1 Answers

it seems that Werkzeug changed their exceptions logic some months ago with https://github.com/mitsuhiko/werkzeug/commit/2723a117e34207f33ff075a9ea6d1f28a33131d3.

Hence flask-restful is a bit outdated. I had the same problem and I did a quick hack in order to adapt to the new code, have a look at the changes in https://github.com/vojnovski/flask-restful/commit/8bfd1a8427b15df95a6549afdf4ddb4a49d8f29b.

Have in mind that his also breaks the tests of flask-restful and you need to patch them too if you want to have no test failures.

like image 195
Viktor Vojnovski Avatar answered Oct 25 '22 14:10

Viktor Vojnovski