Declarative parsing and validation of HTTP request objects, with built-in support for popular web frameworks.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Declarative parsing and validation of HTTP request objects, with built-in support for popular web frameworks including Flask, Django, Bottle, Tornado, Pyramid, Falcon, and aiohttp. WebArgs provides a unified interface for parsing request arguments across different web frameworks, using marshmallow schemas for validation and type conversion.
pip install webargsimport webargs
from webargs import fields, validate, ValidationError, missingFramework-specific imports:
from webargs.flaskparser import use_args, use_kwargs
from webargs.djangoparser import use_args, use_kwargs
from webargs.aiohttpparser import use_args, use_kwargs
# ... other framework parsersfrom flask import Flask
from webargs import fields
from webargs.flaskparser import use_args
app = Flask(__name__)
# Define argument schema
user_args = {
"name": fields.Str(required=True),
"age": fields.Int(missing=18),
"email": fields.Email(),
"active": fields.Bool(location="query")
}
@app.route("/users", methods=["POST"])
@use_args(user_args)
def create_user(args):
name = args["name"]
age = args["age"]
return f"Created user {name}, age {age}"
# Using as kwargs
@app.route("/users/<int:user_id>", methods=["PUT"])
@use_kwargs(user_args)
def update_user(user_id, name, age, email, active):
return f"Updated user {user_id}: {name}"WebArgs follows a modular architecture with three main components:
Parser class providing framework-agnostic parsing logicThe architecture enables consistent request parsing across different web frameworks while maintaining framework-specific optimizations and error handling patterns.
Central parsing functionality including the base Parser class, parse methods, decorators for automatic argument injection, and location-based data loading.
class Parser:
def parse(self, argmap, req=None, *, location=None, unknown=None, validate=None, error_status_code=None, error_headers=None): ...
def use_args(self, argmap, req=None, *, location=None, unknown=None, as_kwargs=False, arg_name=None, validate=None, error_status_code=None, error_headers=None): ...
def use_kwargs(self, argmap, req=None, *, location=None, unknown=None, validate=None, error_status_code=None, error_headers=None): ...Custom field types and marshmallow field integration for parsing delimited strings, handling nested data structures, and extending field validation capabilities.
class DelimitedList(Field):
def __init__(self, cls_or_instance, *, delimiter=None, **kwargs): ...
class DelimitedTuple(Field):
def __init__(self, tuple_fields, *, delimiter=None, **kwargs): ...Framework-specific parser implementations that provide seamless integration with Flask, Django, Bottle, Tornado, Pyramid, Falcon, and aiohttp, including async support.
class FlaskParser(Parser): ...
class DjangoParser(Parser): ...
class AIOHTTPParser(AsyncParser): ...
# ... other framework parsers
def use_args(argmap, req=None, **kwargs): ...
def use_kwargs(argmap, req=None, **kwargs): ...Testing support including base test classes for parser validation, common test scenarios, and utilities for testing request parsing across different web frameworks.
class CommonTestCase:
def create_app(self): ...
def create_testapp(self, app): ...class ValidationError(marshmallow.ValidationError):
"""Exception raised when validation fails during request parsing."""
# Sentinel value representing missing data
missing = marshmallow.missing
ArgMap = Union[
marshmallow.Schema,
Type[marshmallow.Schema],
Mapping[str, marshmallow.fields.Field],
Callable[[Request], marshmallow.Schema]
]
ValidateArg = Union[None, Callable, Iterable[Callable]]
ErrorHandler = Callable[..., NoReturn]
Request = TypeVar("Request")