Blob Blame History Raw
From f71b4f61d96c43748ca1cb9002f874a8d8276312 Mon Sep 17 00:00:00 2001
From: Stephen Pascoe <stephen.pascoe@lirico.co.uk>
Date: Wed, 4 Oct 2017 01:01:47 +0100
Subject: [PATCH] Fix arguments with type=list (#705)

Closes #681
---
 flask_restful/reqparse.py |  2 +-
 tests/test_reqparse.py    | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/flask_restful/reqparse.py b/flask_restful/reqparse.py
index 8fe142e..527bc94 100644
--- flask_restful/reqparse.py
+++ flask_restful/reqparse.py
@@ -176,7 +176,7 @@ class Argument(object):
                     values = source.getlist(name)
                 else:
                     values = source.get(name)
-                    if not isinstance(values, collections.MutableSequence):
+                    if not (isinstance(values, collections.MutableSequence) and self.action == 'append'):
                         values = [values]
 
                 for value in values:
diff --git a/tests/test_reqparse.py b/tests/test_reqparse.py
index ce9ce30..df18ead 100644
--- tests/test_reqparse.py
+++ tests/test_reqparse.py
@@ -891,5 +891,30 @@ class ReqParseTestCase(unittest.TestCase):
             self.assertEquals(args['int1'], 1)
             self.assertEquals(args['int2'], 2)
 
+    def test_list_argument(self):
+        app = Flask(__name__)
+
+        parser = RequestParser()
+        parser.add_argument('arg1', location='json', type=list)
+
+        with app.test_request_context('/bubble', method="post",
+                                      data=json.dumps({'arg1': ['foo', 'bar']}),
+                                      content_type='application/json'):
+            args = parser.parse_args()
+            self.assertEquals(args['arg1'], ['foo', 'bar'])
+
+    def test_list_argument_dict(self):
+        app = Flask(__name__)
+
+        parser = RequestParser()
+        parser.add_argument('arg1', location='json', type=list)
+
+        with app.test_request_context('/bubble', method="post",
+                                      data=json.dumps({'arg1': [{'foo': 1, 'bar': 2}]}),
+                                      content_type='application/json'):
+            args = parser.parse_args()
+            self.assertEquals(args['arg1'], [{'foo': 1, 'bar': 2}])
+
+
 if __name__ == '__main__':
     unittest.main()
-- 
2.17.0.rc1