flask-restplus-patched icon indicating copy to clipboard operation
flask-restplus-patched copied to clipboard

Not Implemented Error due to api.expect decorator in POST/PUT methods

Open jebrage opened this issue 6 years ago • 1 comments

I am trying to run flask_restplus with Marshmallow and Sqlalchemy. However, I get this error whenever I use the @api.expect decorator. This is the traceback.


Traceback (most recent call last):
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus/api.py", line 577, in error_router
    return original_handler(e)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus/api.py", line 577, in error_router
    return original_handler(e)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus/api.py", line 319, in wrapper
    resp = resource(*args, **kwargs)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask/views.py", line 88, in view
    return self.dispatch_request(*args, **kwargs)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus/resource.py", line 42, in dispatch_request
    self.validate_payload(meth)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus/resource.py", line 88, in validate_payload
    self.__validate_payload(expect, collection=False)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus/resource.py", line 73, in __validate_payload
    expect.validate(data, self.api.refresolver, self.api.format_checker)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus/model.py", line 98, in validate
    validator = Draft4Validator(self.__schema__, resolver=resolver, format_checker=format_checker)
  File "/Users/kushal/venv/lib/python3.7/site-packages/werkzeug/utils.py", line 73, in __get__
    value = self.func(obj)
  File "/Users/kushal/venv/lib/python3.7/site-packages/flask_restplus_patched/model.py", line 47, in __schema__
    raise NotImplementedError()
NotImplementedError

Here is the decorator code which causes the issue.

from flask_restplus_patched import Api
class CompanySchema(ModelSchema):
    id = ma_fields.Integer(readOnly=True, description='The unique identifier of a Company')
    name = ma_fields.String(required=True, description='Company name')
    status = ma_fields.String(required=False, description='Company Status')

    class Meta:
        model = Company
        session = db.session

        fields = (
            Company.id.key,
            Company.name.key,
            Company.status.key
        )
        dump_only = (
            Company.id.key
        )

api = Api(version='1.0', title='HOD_BOOKINGS_API',
          description='Documentation for APIs', prefix='/api/v1', doc='/docs')

ns = api.namespace('booking/company', description='Operations related to Companies')

company = api.model('HOD Company', model=CompanySchema())

@ns.route('/')
class CompanyCollection(Resource):

    @api.response(code=204, description='Company successfully created.')
    @api.expect(company)
    def post(self):
        """
        Creates a new company.
        """
        data = request.json
        return create_company(data), 204

jebrage avatar Aug 03 '18 06:08 jebrage

Ok I have found a workaround Replace @api.expect with @api.parameters like this.

@api.parameters(CompanySchema(), locations=('json', 'form'))
   def post(self, data):
       """
       Creates a new company.
       """
       # data = request.json
       return create_company(data), 204

jebrage avatar Aug 03 '18 07:08 jebrage