Skip to content

@marshal_with(None) don't work for function-based views #89

Open
@NotJustPizza

Description

@NotJustPizza

In docs (https://flask-apispec.readthedocs.io/en/latest/usage.html) we can find this example:

from flask import make_response
from flask_apispec.views import MethodResource

class PetResource(MethodResource):

    @marshal_with(PetSchema)
    def get(self, pet_id):
        return Pet.query.filter(Pet.id == pet_id).one()

    @use_kwargs(PetSchema)
    @marshal_with(PetSchema, code=201)
    def post(self, **kwargs):
        return Pet(**kwargs)

    @use_kwargs(PetSchema)
    @marshal_with(PetSchema)
    def put(self, pet_id, **kwargs):
        pet = Pet.query.filter(Pet.id == pet_id).one()
        pet.__dict__.update(**kwargs)
        return pet

    @marshal_with(None, code=204)
    def delete(self, pet_id):
        pet = Pet.query.filter(Pet.id == pet_id).one()
        pet.delete()
        return make_response('', 204)

I tried same, but using function-based views, examples:

@app.route("/pet", methods=["DELETE"])
@marshal_with(None, code=204)
def delete_pet():
    return None, 204

@app.route("/pet", methods=["POST"])
@marshal_with(None, code=204)
def upade_pet():
    return None, 204
 * Running on http://localhost:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [08/Apr/2018 03:47:00] "DELETE /pet HTTP/1.1" 500 -
Error on request:
Traceback (most recent call last):
  File "C:<path to project>\venv\lib\site-packages\werkzeug\serving.py", line 270, in run_wsgi
    execute(self.server.app)
  File "C:<path to project>\venv\lib\site-packages\werkzeug\serving.py", line 258, in execute
    application_iter = app(environ, start_response)
  File "C:<path to project>\venv\lib\site-packages\werkzeug\wsgi.py", line 826, in __call__
    return app(environ, start_response)
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:<path to project>\venv\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:<path to project>\venv\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:<path to project>\venv\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:<path to project>\venv\lib\site-packages\flask_apispec\annotations.py", line 117, in wrapped
    return wrapper(*args, **kwargs)
  File "C:<path to project>\venv\lib\site-packages\flask_apispec\wrapper.py", line 34, in __call__
    return self.marshal_result(unpacked, status_code)
  File "C:<path to project>\venv\lib\site-packages\flask_apispec\wrapper.py", line 58, in marshal_result
    dumped = schema.dump(unpacked[0])
AttributeError: 'dict' object has no attribute 'dump'

It works with "@marshal_with(MyShema, code=204)", but never with None as first parameter.

//Edit

Workaround is to define empty schema:

class EmptySchema(Schema):
    pass

and use:

@marshal_with(EmptySchema, code=204)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions