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)
-
You can set empty dict/list: for empty list:
"article.authors[]": None
->{"article": {"authors": [] }}
for empty dict:"article.": None
->{"article": {} }
.
last dot for empty dict (availables indot
,mixed
andmixed-dot
options)[]
brackets empty for empty list (availables inbrackets
,mixed
andmixed-dot
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,
# output of parser is converted to querydict
# if is set to False, dict python is returned
"querydict": True,
}
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
File details
Details for the file nested-multipart-parser-1.5.0.tar.gz
.
File metadata
- Download URL: nested-multipart-parser-1.5.0.tar.gz
- Upload date:
- Size: 7.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 28039b6c8acd3d3aa17791f50773f23b7e28604503eec628e8e08932768f73a9 |
|
MD5 | 239c6a12263b8d375748e5ec2b4f2a59 |
|
BLAKE2b-256 | 7e37f7bdf0fc439fb2ed11a0ac9f303f94abab36e48e6d90c109fb4c51b39092 |