Skip to content

Instantly share code, notes, and snippets.

@matomesc
Created November 13, 2013 04:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matomesc/7443750 to your computer and use it in GitHub Desktop.
Save matomesc/7443750 to your computer and use it in GitHub Desktop.
flask-restful NestedRequestParser
from flask import request
from flask.ext.restful.reqparse import Argument, RequestParser
class NestedArgument(Argument):
def __init__(self, name, **kwargs):
pieces = name.split('.')
self.full_name = name
if len(pieces) > 1:
name = pieces.pop()
super(NestedArgument, self).__init__(name, **kwargs)
def source(self, request):
pieces = self.full_name.split('.')
source = super(NestedArgument, self).source(request)
if len(pieces) == 1:
return source
for piece in pieces[:-1]:
source = source.get(piece, None)
if source is None:
self.handle_validation_error(ValueError(
u"{0} is required in {1}".format(
self.full_name,
self.location
)))
return source
class NestedRequestParser(RequestParser):
def __init__(self):
super(NestedRequestParser, self).__init__(argument_class=NestedArgument)
def parse_args(self, req=None):
if req is None:
req = request
namespace = self.namespace_class()
for arg in self.args:
pieces = arg.full_name.split('.')
current = namespace
# setup namespace for nested arguments
# given a `full_name` of `a.b.c`, we create namespace { 'a': { 'b': {} } }
if len(pieces) > 1:
for i in range(0, len(pieces) - 1):
if current.get(pieces[i]) is None:
current[pieces[i]] = {}
current = current[pieces[i]]
current[arg.dest or arg.name] = arg.parse(req)
return namespace
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment