flask-restx icon indicating copy to clipboard operation
flask-restx copied to clipboard

marshal_with fails for a list with a simple datatype

Open fliiiix opened this issue 2 years ago • 0 comments

Code

from flask import Flask
from flask_restx import Api, fields, Resource

app = Flask(__name__)
app.config["RESTX_VALIDATE"] = True

api = Api(app)
ns = api.namespace("foo", description="FooBar")


@ns.route("")
class Main(Resource):
    @ns.marshal_with(fields.List(fields.String))
    def get(self):
        return ["foo", "bar", "baz"], 200


if __name__ == "__main__":
    app.run(debug=False)

Repro Steps (if applicable)

See code.

Expected Behavior

marshal_with is able to marshal a List with a simple data type.

Actual Behavior

Currently it fails see stacktrace because a dict of fields is expected.

Error Messages/Stack Trace

[2021-11-29 14:47:13,178] ERROR in app: Exception on /foo [GET]
Traceback (most recent call last):
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask/app.py", line 1516, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask/app.py", line 1502, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/api.py", line 403, in wrapper
    resp = resource(*args, **kwargs)
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask/views.py", line 84, in view
    return current_app.ensure_sync(self.dispatch_request)(*args, **kwargs)
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/resource.py", line 49, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/marshalling.py", line 256, in wrapper
    marshal(
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/marshalling.py", line 58, in marshal
    out, has_wildcards = _marshal(data, fields, envelope, skip_none, mask, ordered)
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/marshalling.py", line 163, in _marshal
    out = [marshal(d, fields, skip_none=skip_none, ordered=ordered) for d in data]
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/marshalling.py", line 163, in <listcomp>
    out = [marshal(d, fields, skip_none=skip_none, ordered=ordered) for d in data]
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/marshalling.py", line 58, in marshal
    out, has_wildcards = _marshal(data, fields, envelope, skip_none, mask, ordered)
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/flask_restx/marshalling.py", line 181, in _marshal
    for k, v in iteritems(fields)
  File "/home/users/fliiiix/marshal/env/lib/python3.8/site-packages/six.py", line 605, in iteritems
    return iter(d.items(**kw))
AttributeError: 'List' object has no attribute 'items'

Environment

  • Python version 3.8.10
  • Flask version Flask==2.0.2
  • Flask-RESTX version flask-restx==0.5.1

Additional Context

marshal_with_field would do the trick of marshaling but then nothing is documented swagger. (note: i guess it's not documented because its not part of the namespace object?)

fliiiix avatar Nov 29 '21 14:11 fliiiix