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

AttributeError: 'SchemaModel' object has no attribute 'items'

Open edwinhaver opened this issue 4 years ago • 8 comments

Hi,

I am trying to use @api.marshal_with a JSON schema but I get the following error: AttributeError: 'SchemaModel' object has no attribute 'items'

The schema is correct as it works with @api.response and the model is shown correctly in Swagger.

Code

downloadOrderResponse = api.schema_model('DownloadOrderResponse', {
    'properties': {
        'iccid': {
            "type" : "string",
            "pattern" : "^[0-9]{19}[0-9F]?$",
            "description" : "ICCID as described in section 5.2.1"
        }
    },
    'type': 'object'
})

@api.route('/downloadOrder')
class DownloadOrder(Resource):
    @api.marshal_with(downloadOrderResponse, skip_none=True)
    def post(self):
        return {
            "iccid": "01234567890123456789"
        }

Expected Behavior

Correct response marshalling using the JSON schema.

Actual Behavior

Throws: AttributeError: 'SchemaModel' object has no attribute 'items'

Error Messages/Stack Trace

Traceback (most recent call last): File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 2464, in call return self.wsgi_app(environ, start_response) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 2450, in wsgi_app response = self.handle_exception(e) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/api.py", line 638, in error_router return original_handler(f) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 1867, in handle_exception reraise(exc_type, exc_value, tb) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise raise value File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/api.py", line 636, in error_router return self.handle_error(e) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app response = self.full_dispatch_request() File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request rv = self.handle_user_exception(e) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/api.py", line 638, in error_router return original_handler(f) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception reraise(exc_type, exc_value, tb) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise raise value File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/api.py", line 636, in error_router return self.handle_error(e) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request rv = self.dispatch_request() File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request return self.view_functionsrule.endpoint File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/api.py", line 375, in wrapper resp = resource(*args, **kwargs) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask/views.py", line 89, in view return self.dispatch_request(*args, **kwargs) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/resource.py", line 44, in dispatch_request resp = meth(*args, **kwargs) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/marshalling.py", line 269, in wrapper resp, self.fields, self.envelope, self.skip_none, mask, self.ordered File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/marshalling.py", line 58, in marshal out, has_wildcards = _marshal(data, fields, envelope, skip_none, mask, ordered) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/flask_restx/marshalling.py", line 181, in _marshal for k, v in iteritems(fields) File "/Users/edwin/.local/share/virtualenvs/flask-test-BGYUVEN8/lib/python3.7/site-packages/six.py", line 589, in iteritems return iter(d.items(**kw)) AttributeError: 'SchemaModel' object has no attribute 'items'

Environment

  • Python version: 3.7.4
  • Flask version: 1.1.2
  • Werkzeug version: 1.0.1
  • Flask-RESTX version: 0.2.0

edwinhaver avatar May 24 '20 11:05 edwinhaver

I've seen this issue in the past, https://github.com/noirbizarre/flask-restplus/issues/293

Would be great to reliably use JSON schemas as models.

natm avatar Jun 03 '20 12:06 natm

Same happens for me.. Seems like there is no way to use marshal_with with schema model, just with schema...

syzhakov avatar Oct 01 '20 16:10 syzhakov

Are there any known workarounds for this bug?

er1csu avatar Mar 10 '21 20:03 er1csu

Has anyone looked into this recently? I'm keen to know the workaround also

harshal-c avatar Sep 10 '21 17:09 harshal-c

I got same error in my code, when I was import from flask_restful import marshal_with then solution was I replaced it with flask_apispec import marshal_with then It's fixed.

PrashantChouksey avatar Sep 22 '21 16:09 PrashantChouksey

I got same error in my code, when I was import from flask_restful import marshal_with then solution was I replaced it with flask_apispec import marshal_with then It's fixed.

@PrashantChouksey I followed this recommendation and was unable to use the marshal_with() decorator. Could you elaborate perhaps with an example of how you were able to do this?

Here's my code and my change... Original code with AttributeError: 'SchemaModel' object has no attribute 'items' error.

@ns.route("/settings")
class Settings(Resource):
    model = ns.schema_model('User Settings', settings_schema)
    @ns.marshal_with(model)
    def get(self):
        """Read in user.json file and return contents of file."""
        with open(USER_FILE, 'r') as f:
            data = json.loads(f.read())
        return data

Updated code with new error AttributeError: 'SchemaModel' object has no attribute 'dump'

from flask_apispec import marshal_with
...
@ns.route("/settings")
class Settings(Resource):
    model = ns.schema_model('User Settings', settings_schema)
    @marshal_with(model)
    def get(self):
        """Read in user.json file and return contents of file."""
        with open(USER_FILE, 'r') as f:
            data = json.loads(f.read())
        return data

The swagger docs do not show the 'Example Value' with the updated method either.

sylv01 avatar Feb 24 '22 15:02 sylv01

Still an issue...

CharlesPerrotMinotHCHB avatar Mar 28 '24 18:03 CharlesPerrotMinotHCHB