Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot Make Response Schema #253

Open
sharokh23 opened this issue May 25, 2023 · 0 comments
Open

Cannot Make Response Schema #253

sharokh23 opened this issue May 25, 2023 · 0 comments

Comments

@sharokh23
Copy link

sharokh23 commented May 25, 2023

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant