Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
033c0ae7
Commit
033c0ae7
authored
Mar 04, 2011
by
spiq
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
forms and multipat parsers now flaten data
parent
91b33659
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
38 additions
and
27 deletions
+38
-27
djangorestframework/content.py
+1
-7
djangorestframework/parsers.py
+37
-20
No files found.
djangorestframework/content.py
View file @
033c0ae7
...
@@ -60,7 +60,6 @@ class OverloadedContentMixin(ContentMixin):
...
@@ -60,7 +60,6 @@ class OverloadedContentMixin(ContentMixin):
Note that content_type may be None if it is unset."""
Note that content_type may be None if it is unset."""
if
not
request
.
META
.
get
(
'CONTENT_LENGTH'
,
None
)
and
not
request
.
META
.
get
(
'TRANSFER_ENCODING'
,
None
):
if
not
request
.
META
.
get
(
'CONTENT_LENGTH'
,
None
)
and
not
request
.
META
.
get
(
'TRANSFER_ENCODING'
,
None
):
return
None
return
None
content_type
=
request
.
META
.
get
(
'CONTENT_TYPE'
,
None
)
content_type
=
request
.
META
.
get
(
'CONTENT_TYPE'
,
None
)
if
(
request
.
method
==
'POST'
and
self
.
CONTENT_PARAM
and
if
(
request
.
method
==
'POST'
and
self
.
CONTENT_PARAM
and
...
@@ -74,11 +73,6 @@ class OverloadedContentMixin(ContentMixin):
...
@@ -74,11 +73,6 @@ class OverloadedContentMixin(ContentMixin):
return
(
content_type
,
request
.
POST
[
self
.
CONTENT_PARAM
])
return
(
content_type
,
request
.
POST
[
self
.
CONTENT_PARAM
])
elif
request
.
method
==
'PUT'
:
elif
request
.
method
==
'PUT'
:
f
=
SocketFile
(
request
.
environ
[
'wsgi.input'
],
request
.
META
[
'CONTENT_LENGTH'
])
f
=
SocketFile
(
request
.
environ
[
'wsgi.input'
],
request
.
META
[
'CONTENT_LENGTH'
])
returned
=
(
content_type
,
f
.
read
())
return
(
content_type
,
f
.
read
())
return
returned
#try:
# f.close()
#except Exception as e:
# print 'exception', e
else
:
else
:
return
(
content_type
,
request
.
raw_post_data
)
return
(
content_type
,
request
.
raw_post_data
)
djangorestframework/parsers.py
View file @
033c0ae7
...
@@ -78,12 +78,36 @@ class JSONParser(BaseParser):
...
@@ -78,12 +78,36 @@ class JSONParser(BaseParser):
class
XMLParser
(
BaseParser
):
class
XMLParser
(
BaseParser
):
media_type
=
'application/xml'
media_type
=
'application/xml'
class
DataFlatener
(
object
):
class
FormParser
(
BaseParser
):
def
flatten_data
(
self
,
data
):
"""Given a data dictionary ``{<attr_name>: <value_list>}``, returns a flattened dictionary according to :meth:`FormParser.is_a_list`.
"""
#TODO : document + test
flatdata
=
dict
()
for
attr_name
,
attr_value
in
data
.
items
():
if
self
.
is_a_list
(
attr_name
):
if
isinstance
(
attr_value
,
list
):
flatdata
[
attr_name
]
=
attr_value
else
:
flatdata
[
attr_name
]
=
[
attr_value
]
else
:
if
isinstance
(
attr_value
,
list
):
flatdata
[
attr_name
]
=
attr_value
[
0
]
else
:
flatdata
[
attr_name
]
=
attr_value
return
flatdata
def
is_a_list
(
self
,
attr_name
):
""" """
#TODO: document
return
False
class
FormParser
(
BaseParser
,
DataFlatener
):
"""The default parser for form data.
"""The default parser for form data.
Return a dict containing a single value for each non-reserved parameter.
Return a dict containing a single value for each non-reserved parameter.
"""
"""
# TODO:
not good, because posted/put lists are flattened !!!
# TODO:
writing tests for PUT files + normal data
media_type
=
'application/x-www-form-urlencoded'
media_type
=
'application/x-www-form-urlencoded'
def
parse
(
self
,
input
):
def
parse
(
self
,
input
):
...
@@ -91,13 +115,12 @@ class FormParser(BaseParser):
...
@@ -91,13 +115,12 @@ class FormParser(BaseParser):
if
request
.
method
==
'PUT'
:
if
request
.
method
==
'PUT'
:
data
=
parse_qs
(
input
)
data
=
parse_qs
(
input
)
# Flattening the parsed query data
for
key
,
val
in
data
.
items
():
data
[
key
]
=
val
[
0
]
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
# Django has already done the form parsing for us.
# Django has already done the form parsing for us.
data
=
dict
(
request
.
POST
.
items
())
data
=
request
.
POST
data
=
self
.
flatten_data
(
data
)
# Strip any parameters that we are treating as reserved
# Strip any parameters that we are treating as reserved
for
key
in
data
:
for
key
in
data
:
...
@@ -106,7 +129,7 @@ class FormParser(BaseParser):
...
@@ -106,7 +129,7 @@ class FormParser(BaseParser):
return
data
return
data
# TODO: Allow parsers to specify multiple media_types
# TODO: Allow parsers to specify multiple media_types
class
MultipartParser
(
FormPars
er
):
class
MultipartParser
(
BaseParser
,
DataFlaten
er
):
media_type
=
'multipart/form-data'
media_type
=
'multipart/form-data'
def
parse
(
self
,
input
):
def
parse
(
self
,
input
):
...
@@ -116,19 +139,14 @@ class MultipartParser(FormParser):
...
@@ -116,19 +139,14 @@ class MultipartParser(FormParser):
upload_handlers
=
request
.
_get_upload_handlers
()
upload_handlers
=
request
.
_get_upload_handlers
()
django_mpp
=
DjangoMPParser
(
request
.
META
,
StringIO
(
input
),
upload_handlers
)
django_mpp
=
DjangoMPParser
(
request
.
META
,
StringIO
(
input
),
upload_handlers
)
data
,
files
=
django_mpp
.
parse
()
data
,
files
=
django_mpp
.
parse
()
data
=
dict
(
data
)
files
=
dict
(
files
)
if
request
.
method
==
'POST'
:
el
if
request
.
method
==
'POST'
:
# Django has already done the form parsing for us.
# Django has already done the form parsing for us.
data
=
dict
(
request
.
POST
)
data
=
request
.
POST
files
=
dict
(
request
.
FILES
)
files
=
request
.
FILES
# Flattening, then merging the POSTED/PUT data/files
data
=
self
.
flatten_data
(
data
)
for
key
,
val
in
dict
(
data
)
.
items
():
files
=
self
.
flatten_data
(
files
)
data
[
key
]
=
val
[
0
]
for
key
,
val
in
dict
(
files
)
.
items
():
files
[
key
]
=
val
[
0
]
.
read
()
data
.
update
(
files
)
data
.
update
(
files
)
# Strip any parameters that we are treating as reserved
# Strip any parameters that we are treating as reserved
...
@@ -136,4 +154,3 @@ class MultipartParser(FormParser):
...
@@ -136,4 +154,3 @@ class MultipartParser(FormParser):
if
key
in
self
.
resource
.
RESERVED_FORM_PARAMS
:
if
key
in
self
.
resource
.
RESERVED_FORM_PARAMS
:
data
.
pop
(
key
)
data
.
pop
(
key
)
return
data
return
data
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment