Skip to content

Cannot Make Response Schema #253

Open
@sharokh23

Description

@sharokh23

I am trying to define a simple resource with a sample response schema so as to display in the docs. I only have two attributes in the class and every time I am trying to run it I get:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/tenacity/__init__.py", line 333, in wrapped_f
    return self(f, *args, **kw)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/tenacity/__init__.py", line 423, in __call__
    do = self.iter(retry_state=retry_state)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/tenacity/__init__.py", line 360, in iter
    return fut.result()
  File "/usr/local/lib/python3.8/concurrent/futures/_base.py", line 432, in result
    return self.__get_result()
  File "/usr/local/lib/python3.8/concurrent/futures/_base.py", line 388, in __get_result
    raise self._exception
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/tenacity/__init__.py", line 426, in __call__
    result = fn(*args, **kwargs)
  File "/home/app/amp/helpers/check_db_available.py", line 14, in main
    app = create_app()
  File "/home/app/amp/app.py", line 92, in create_app
    load_resources(app)
  File "/home/app/amp/core/loaders/resource.py", line 19, in load_resources
    app.docs.register(r, endpoint=r.endpoint)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/flask_apispec/extension.py", line 127, in register
    self._defer(self._register, target, endpoint, blueprint,
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/flask_apispec/extension.py", line 71, in _defer
    bound()
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/flask_apispec/extension.py", line 157, in _register
    self.spec.path(**path)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/core.py", line 534, in path
    plugin.operation_helper(path=path, operations=operations, **kwargs)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/__init__.py", line 224, in operation_helper
    self.resolver.resolve_operations(operations)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/schema_resolver.py", line 35, in resolve_operations
    self.resolve_response(response)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/schema_resolver.py", line 183, in resolve_response
    self.resolve_schema(response)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/schema_resolver.py", line 225, in resolve_schema
    data["schema"] = self.resolve_schema_dict(data["schema"])
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/schema_resolver.py", line 295, in resolve_schema_dict
    return self.converter.resolve_nested_schema(schema)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/openapi.py", line 134, in resolve_nested_schema
    self.spec.components.schema(name, schema=schema)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/core.py", line 171, in schema
    ret.update(plugin.schema_helper(component_id, ret, **kwargs) or {})
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/__init__.py", line 182, in schema_helper
    json_schema = self.converter.schema2jsonschema(schema_instance)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/openapi.py", line 253, in schema2jsonschema
    jsonschema = self.fields2jsonschema(fields, partial=partial)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/openapi.py", line 278, in fields2jsonschema
    prop = self.field2property(field_obj)
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/field_converter.py", line 172, in field2property
    ret.update(attr_func(field, ret=ret))
  File "/home/app/cache/virtualenvs/amp-_geWzZZ1-py3.8/lib/python3.8/site-packages/apispec/ext/marshmallow/field_converter.py", line 223, in field2default
    default = field.load_default
AttributeError: 'String' object has no attribute 'load_default'

I am defining it according to the documentation:

from amp.core.models.base import APIResource
from flask_apispec import doc, marshal_with
from marshmallow import Schema, fields
from amp.core.extensions.db import db

__all__ = ('HealthCheckResource',)

class HealthCheckResponseSchema(Schema):
    status = fields.String(default="ok")
    db = fields.String(default="ok")

class HealthCheckResource(APIResource):
    url = "/api/healthcheck"
    endpoint = "api.healthcheck"

    @doc(
        summary="General health check",
        description="My First GET Awesome API.",
        tags=['Health Check'],
    )
    @marshal_with(
        schema=HealthCheckResponseSchema,
        description="Successful operation",
        code=200)
    def get(self):
        db_status = "ok"
        try:
            db.engine.execute("SELECT 1")
        except Exception as e:
            db_status = db_status = "degraded"
        statuses = [
            db_status
        ]

        if any([s != "ok" for s in statuses]):
            return {
                "status": "degraded",
                "db": db_status
            }
        else:
            return {
                "status": "ok",
                "db": db_status,
            }

Any help is much appreciated!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions