Skip to content

Commit 98fdf21

Browse files
authored
Merge pull request #119 from elatomo/fix-103-use-kwargs-and-post-load
Adds support for marshmallow `@post_load`
2 parents a9f3821 + 6ec36d3 commit 98fdf21

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

flask_apispec/wrapper.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
# -*- coding: utf-8 -*-
2+
try:
3+
from collections.abc import Mapping
4+
except ImportError: # Python 2
5+
from collections import Mapping
26

3-
from six.moves import http_client as http
47

58
import flask
6-
9+
import marshmallow as ma
710
import werkzeug
11+
from six.moves import http_client as http
812
from webargs import flaskparser
913

1014
from flask_apispec import utils
1115

12-
import marshmallow as ma
1316

1417
MARSHMALLOW_VERSION_INFO = tuple(
1518
[int(part) for part in ma.__version__.split('.') if part.isdigit()]
@@ -43,8 +46,11 @@ def call_view(self, *args, **kwargs):
4346
parsed = parser.parse(schema, locations=option['kwargs']['locations'])
4447
if getattr(schema, 'many', False):
4548
args += tuple(parsed)
46-
else:
49+
elif isinstance(parsed, Mapping):
4750
kwargs.update(parsed)
51+
else:
52+
args += (parsed, )
53+
4854
return self.func(*args, **kwargs)
4955

5056
def marshal_result(self, unpacked, status_code):

tests/test_views.py

+26-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import json
44

55
from flask import make_response
6-
from marshmallow import fields, Schema
6+
from marshmallow import fields, Schema, post_load
77

88
from flask_apispec.utils import Ref
99
from flask_apispec.views import MethodResource
@@ -30,6 +30,31 @@ def view(**kwargs):
3030
res = client.get('/', {'name': 'freddie'})
3131
assert res.json == {'name': 'freddie'}
3232

33+
def test_use_kwargs_schema_with_post_load(self, app, client):
34+
class User:
35+
def __init__(self, name):
36+
self.name = name
37+
38+
def update(self, name):
39+
self.name = name
40+
41+
class ArgSchema(Schema):
42+
name = fields.Str()
43+
44+
@post_load
45+
def make_object(self, data):
46+
return User(**data)
47+
48+
@app.route('/', methods=('POST', ))
49+
@use_kwargs(ArgSchema())
50+
def view(user):
51+
assert isinstance(user, User)
52+
return {'name': user.name}
53+
54+
data = {'name': 'freddie'}
55+
res = client.post('/', data)
56+
assert res.json == data
57+
3358
def test_use_kwargs_schema_many(self, app, client):
3459
class ArgSchema(Schema):
3560
name = fields.Str()

0 commit comments

Comments
 (0)