Bug fixes:
- aiohttpparser: Fix bug that raised a
JSONDecodeError
raised when parsing non-JSON requests using defaultlocations
(:issue:`80`). Thanks :user:`leonidumanskiy` for reporting. - Fix parsing JSON requests that have a vendor media type, e.g.
application/vnd.api+json
.
Features:
Parser.parse
,Parser.use_args
andParser.use_kwargs
can take a Schema factory as the first argument (:issue:`73`). Thanks :user:`DamianHeard` for the suggestion and the PR.
Support:
- Docs: Add "Custom Parsers" section with example of parsing nested querystring arguments (:issue:`74`). Thanks :user:`dwieeb`.
- Docs: Add "Advanced Usage" page.
Features:
- Add
AIOHTTPParser
(:issue:`71`). - Add
webargs.async
module withAsyncParser
.
Bug fixes:
- If an empty list is passed to a List argument, it will be parsed as an empty list rather than being excluded from the parsed arguments dict (:issue:`70`). Thanks :user:`mTatcher` for catching this.
Other changes:
- Backwards-incompatible: When decorating resource methods with
FalconParser.use_args
, the parsed arguments dictionary will be positioned after the request and response arguments. - Backwards-incompatible: When decorating views with
DjangoParser.use_args
, the parsed arguments dictionary will be positioned after the request argument. - Backwards-incompatible:
Parser.get_request_from_view_args
gets passed a view function as its first argument. - Backwards-incompatible: Remove logging from default error handlers.
Features:
- Add
FalconParser
(:issue:`63`). - Add
fields.DelimitedList
(:issue:`66`). Thanks :user:`jmcarp`. TornadoParser
will parse json withsimplejson
if it is installed.BottleParser
caches parsed json per-request for improved performance.
No breaking changes. Yay!
Features:
TornadoParser
returns unicode strings rather than bytestrings (:issue:`41`). Thanks :user:`thomasboyt` for the suggestion.- Add
Parser.get_default_request
andParser.get_request_from_view_args
hooks to simplifyParser
implementations. - Backwards-compatible:
webargs.core.get_value
takes aField
as its last argument. Note: this is technically a breaking change, but this won't affect most users sinceget_value
is only used internally byParser
classes.
Support:
- Add
examples/annotations_example.py
(demonstrates using Python 3 function annotations to define request arguments). - Fix examples. Thanks :user:`hyunchel` for catching an error in the Flask error handling docs.
Bug fixes:
- Correctly pass
validate
andforce_all
params toPyramidParser.use_args
.
The major change in this release is that webargs now depends on marshmallow for defining arguments and validation.
Your code will need to be updated to use Fields
rather than Args
.
# Old API
from webargs import Arg
args = {
'name': Arg(str, required=True)
'password': Arg(str, validate=lambda p: len(p) >= 6),
'display_per_page': Arg(int, default=10),
'nickname': Arg(multiple=True),
'Content-Type': Arg(dest='content_type', location='headers'),
'location': Arg({
'city': Arg(str),
'state': Arg(str)
})
'meta': Arg(dict),
}
# New API
from webargs import fields
args = {
'name': fields.Str(required=True)
'password': fields.Str(validate=lambda p: len(p) >= 6),
'display_per_page': fields.Int(missing=10),
'nickname': fields.List(fields.Str()),
'content_type': fields.Str(load_from='Content-Type'),
'location': fields.Nested({
'city': fields.Str(),
'state': fields.Str()
}),
'meta': fields.Dict(),
}
Features:
- Error messages for all arguments are "bundled" (:issue:`58`).
Changes:
- Backwards-incompatible: Replace
Args
with marshmallow fields (:issue:`61`). - Backwards-incompatible: When using
use_kwargs
, missing arguments will have the special valuemissing
rather thanNone
. TornadoParser
raises a customHTTPError
with amessages
attribute when validation fails.
Bug fixes:
- Fix required validation of nested arguments (:issue:`39`, :issue:`51`). These are fixed by virtue of using marshmallow's
Nested
field. Thanks :user:`ewang` and :user:`chavz` for reporting.
Support:
- Updated docs.
- Add
examples/schema_example.py
. - Tested against Python 3.5.
Changes:
- If a parsed argument is
None
, the type conversion function is not called :issue:`54`. Thanks :user:`marcellarius`.
Bug fixes:
- Fix parsing nested
Args
when the argument is missing from the input (:issue:`52`). Thanks :user:`stas`.
Features:
- Add parsing of
matchdict
toPyramidParser
. Thanks :user:`hartror`.
Bug fixes:
- Fix
PyramidParser's
use_kwargs
method (:issue:`42`). Thanks :user:`hartror` for the catch and patch. - Correctly use locations passed to Parser's constructor when using
use_args
(:issue:`44`). Thanks :user:`jacebrowning` for the catch and patch. - Fix behavior of
default
anddest
argument on nestedArgs
(:issue:`40` and :issue:`46`). Thanks :user:`stas`.
Changes:
- A 422 response is returned to the client when a
ValidationError
is raised by a parser (:issue:`38`).
Features:
- Support for webapp2 via the webargs.webapp2parser module. Thanks :user:`Trii`.
- Store argument name on
RequiredArgMissingError
. Thanks :user:`stas`. - Allow error messages for required validation to be overriden. Thanks again :user:`stas`.
Removals:
- Remove
source
parameter fromArg
.
Features:
- Store argument name on
ValidationError
(:issue:`32`). Thanks :user:`alexmic` for the suggestion. Thanks :user:`stas` for the patch. - Allow nesting of dict subtypes.
Changes:
- Add
dest
parameter toArg
constructor which determines the key to be added to the parsed arguments dictionary (:issue:`32`). - Backwards-incompatible: Rename
targets
parameter tolocations
inParser
constructor,Parser#parse_arg
,Parser#parse
,Parser#use_args
, andParser#use_kwargs
. - Backwards-incompatible: Rename
Parser#target_handler
toParser#location_handler
.
Deprecation:
- The
source
parameter is deprecated in favor of thedest
parameter.
Bug fixes:
- Fix
validate
parameter ofDjangoParser#use_args
.
- When parsing a nested
Arg
, filter out extra arguments that are not part of theArg's
nesteddict
(:issue:`28`). Thanks Derrick Gilland for the suggestion. - Fix bug in parsing
Args
with both type coercion andmultiple=True
(:issue:`30`). Thanks Steven Manuatu for reporting. - Raise
RequiredArgMissingError
when a required argument is missing on a request.
- Fix behavior of
multiple=True
when nesting Args (:issue:`29`). Thanks Derrick Gilland for reporting.
- Pyramid support thanks to @philtay.
- User-friendly error messages when
Arg
type conversion/validation fails. Thanks Andriy Yurchuk. - Allow
use
argument to be a list of functions. - Allow
Args
to be nested within each other, e.g. for nested dict validation. Thanks @saritasa for the suggestion. - Backwards-incompatible: Parser will only pass
ValidationErrors
to its error handler function, rather than catching all generic Exceptions. - Backwards-incompatible: Rename
Parser.TARGET_MAP
toParser.__target_map__
. - Add a short-lived cache to the
Parser
class that can be used to store processed request data for reuse. - Docs: Add example usage with Flask-RESTful.
- Fix bug in
TornadoParser
that raised an error when request body is not a string (e.g when it is aFuture
). Thanks Josh Carp.
- Fix
Parser.use_kwargs
behavior when anArg
is allowed missing. Theallow_missing
attribute is ignored whenuse_kwargs
is called. default
may be a callable.- Allow
ValidationError
to specify a HTTP status code for the error response. - Improved error logging.
- Add
'query'
as a valid target name. - Allow a list of validators to be passed to an
Arg
orParser.parse
. - A more useful
__repr__
forArg
. - Add examples and updated docs.
- Add
source
parameter toArg
constructor. Allows renaming of keys in the parsed arguments dictionary. Thanks Josh Carp. FlaskParser's
handle_error
method attaches the string representation of validation errors onerr.data['message']
. The raised exception is stored onerr.data['exc']
.- Additional keyword arguments passed to
Arg
are stored as metadata.
- Fix bug in
TornadoParser's
handle_error
method. Thanks Josh Carp. - Add
error
parameter toParser
constructor that allows a custom error message to be used if schema-level validation fails. - Fix bug that raised a
UnicodeEncodeError
on Python 2 when an Arg's validator function received non-ASCII input.
- Fix regression with parsing an
Arg
with bothdefault
andtarget
set (see issue #11).
- Add
validate
parameter toParser.parse
andParser.use_args
. Allows validation of the full parsed output. - If
allow_missing
isTrue
on anArg
for whichNone
is explicitly passed, the value will still be present in the parsed arguments dictionary. - Backwards-incompatible:
Parser's
parse_*
methods returnwebargs.core.Missing
if the value cannot be found on the request. NOTE:webargs.core.Missing
will not show up in the final output ofParser.parse
. - Fix bug with parsing empty request bodies with
TornadoParser
.
- Fix behavior of
Arg's
allow_missing
parameter whenmultiple=True
. - Fix bug in tornadoparser that caused parsing JSON arguments to fail.
- Fix JSON parsing in Flask parser when Content-Type header contains more than just application/json. Thanks Samir Uppaluru for reporting.
- Backwards-incompatible: The
use
parameter toArg
is called before type conversion occurs. Thanks Eric Wang for the suggestion. - Tested on Tornado>=4.0.
- Custom target handlers can be defined using the
Parser.target_handler
decorator. - Error handler can be specified using the
Parser.error_handler
decorator. Args
can define their request target by passing in atarget
argument.- Backwards-incompatible:
DEFAULT_TARGETS
is now a class member ofParser
. This allows subclasses to override it.
- Fix bug that caused
use_args
to fail on class-based views in Flask. - Add
allow_missing
parameter toArg
.
- Awesome contributions from the open-source community!
- Add
use_kwargs
decorator. Thanks @venuatu. - Tornado support thanks to @jvrsantacruz.
- Tested on Python 3.4.
- Fix bug with parsing JSON in Flask and Bottle.
- Remove print statements in core.py. Oops.
- Add support for repeated parameters (#1).
- Backwards-incompatible: All parse_* methods take arg as their fourth argument.
- Add
error_handler
param toParser
.
- Bottle support.
- Add
targets
param toParser
. Allows setting default targets. - Add
files
target.
- First release.
- Parses JSON, querystring, forms, headers, and cookies.
- Support for Flask and Django.