6

このreqparseを使用して、フラスコアプリでクライアントに意味のある検証を送り返そうとしています。コードは次のとおりです。

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

curl -v http://localhost:5000/p 私がこの応答を受け取ったとき:

* 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

エラーメッセージはどこに行きましたか?

コードをこれに変更すると:

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'

GETリクエストを行うと、これはstdoutにダンプされます...

[('__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'>>)]

ただし、「ok」はクライアントに送信されます。したがって、クライアントは切断しています。

これを使用して意味のあるエラーメッセージをAPIクライアントに送り返したいのですが、コールスタックで別のエラーが発生しているようです。何か案は?

4

1 に答える 1

2

Werkzeug は数か月前にhttps://github.com/mitsuhiko/werkzeug/commit/2723a117e34207f33ff075a9ea6d1f28a33131d3で例外ロジックを変更したようです。

したがって、flask-restful は少し時代遅れです。私は同じ問題を抱えていたので、新しいコードに適応するために簡単なハックを行いまし

彼はフラスコレストフルのテストにも違反していることに注意してください。テストの失敗を防ぎたい場合は、それらにもパッチを当てる必要があります。

于 2013-09-12T13:48:39.143 に答える