A parser for nested data in multipart form
Project description
Nested-multipart-parser
Parser for nested data for 'multipart/form', you can use it in any python project, or use the Django Rest Framework integration.
Installation:
pip install nested-multipart-parser
Usage:
from nested_multipart_parser import NestedParser
options = {
"separator": "bracket"
}
def my_view():
# `options` is optional
parser = NestedParser(data, options)
if parser.is_valid():
validate_data = parser.validate_data
...
else:
print(parser.errors)
Django Rest Framework
from nested_multipart_parser.drf import DrfNestedParser
...
class YourViewSet(viewsets.ViewSet):
parser_classes = (DrfNestedParser,)
What it does:
The parser take the request data and transform it to a Python dictionary:
example:
# input:
{
'title': 'title',
'date': "time",
'simple_object.my_key': 'title'
'simple_object.my_list[0]': True,
'langs[0].id': 666,
'langs[0].title': 'title',
'langs[0].description': 'description',
'langs[0].language': "language",
'langs[1].id': 4566,
'langs[1].title': 'title1',
'langs[1].description': 'description1',
'langs[1].language': "language1"
}
# result:
{
'title': 'title',
'date': "time",
'simple_object': {
'my_key': 'title',
'my_list': [
True
]
},
'langs': [
{
'id': 666,
'title': 'title',
'description': 'description',
'language': 'language'
},
{
'id': 4566,
'title': 'title1',
'description': 'description1',
'language': 'language1'
}
]
}
How it works:
Attributes where sub keys are full numbers only are automatically converted into lists:
data = {
'title[0]': 'my-value',
'title[1]': 'my-second-value'
}
output = {
'title': [
'my-value',
'my-second-value'
]
}
# Be aware of the fact that you have to respect the order of the indices for arrays, thus
'title[2]': 'my-value' # Invalid (you have to set title[0] and title[1] before)
# Also, you can't create an array on a key already set as a prinitive value (int, boolean or string):
'title': 42,
'title[object]': 42 # Invalid
Attributes where sub keys are other than full numbers are converted into Python dictionary:
data = {
'title.key0': 'my-value',
'title.key7': 'my-second-value'
}
output = {
'title': {
'key0': 'my-value',
'key7': 'my-second-value'
}
}
# You have no limit for chained key:
# with "mixed-dot" separator option (same as 'mixed' but with dot after list to object):
data = {
'the[0].chained.key[0].are.awesome[0][0]': 'im here !!'
}
# with "mixed" separator option:
data = {
'the[0]chained.key[0]are.awesome[0][0]': 'im here !!'
}
# With "bracket" separator option:
data = {
'the[0][chained][key][0][are][awesome][0][0]': 'im here !!'
}
# With "dot" separator option:
data = {
'the.0.chained.key.0.are.awesome.0.0': 'im here !!'
}
For this to work perfectly, you must follow the following rules:
-
A first key always need to be set. ex:
title[0]
ortitle
. In both cases the first key istitle
-
For
mixed
ormixed-dot
options, brackets[]
is for list, and dot.
is for object -
For
mixed-dot
options is look likemixed
but with dot when object follow list -
For
bracket
each sub key need to be separate by brackets[ ]
or withdot
options.
-
For
bracket
ordot
options, if a key is number is convert to list else a object -
Don't put spaces between separators.
-
By default, you can't set set duplicates keys (see options)
Options
{
# Separators:
# with mixed-dot: article[0].title.authors[0]: "jhon doe"
# with mixed: article[0]title.authors[0]: "jhon doe"
# with bracket: article[0][title][authors][0]: "jhon doe"
# with dot: article.0.title.authors.0: "jhon doe"
'separator': 'bracket' or 'dot' or 'mixed' or 'mixed-dot', # default is `mixed-dot`
# raise a expections when you have duplicate keys
# ex :
# {
# "article": 42,
# "article[title]": 42,
# }
'raise_duplicate': True, # default is True
# override the duplicate keys, you need to set "raise_duplicate" to False
# ex :
# {
# "article": 42,
# "article[title]": 42,
# }
# the out is
# ex :
# {
# "article"{
# "title": 42,
# }
# }
'assign_duplicate': False # default is False
}
Options for Django Rest Framwork:
# settings.py
...
DRF_NESTED_MULTIPART_PARSER = {
"separator": "mixed-dot",
"raise_duplicate": True,
"assign_duplicate": False
}
JavaScript integration:
You can use this multipart-object library to easy convert object to flat nested object formatted for this library
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Hashes for nested-multipart-parser-1.4.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4f31fba16f0c1f5153af64efe1ed641a2c22618bc041bd43a1a9829ed4295073 |
|
MD5 | 8b954f59081f857d029dd5206b844b8d |
|
BLAKE2b-256 | 570bb7ef2ec4bf0ba8f4ea513091b8ddf38538b158f28083424b6b9420ae495b |