{ "info": { "author": "Steven Loria", "author_email": "sloria1@gmail.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP" ], "description": "*****************\nwebargs-starlette\n*****************\n\n.. image:: https://badgen.net/pypi/v/webargs-starlette\n :target: https://badge.fury.io/py/webargs-starlette\n :alt: PyPI version\n\n.. image:: https://dev.azure.com/sloria/sloria/_apis/build/status/sloria.webargs-starlette?branchName=master\n :target: https://dev.azure.com/sloria/sloria/_build/latest?definitionId=11&branchName=master\n :alt: Build status\n\n.. image:: https://badgen.net/badge/marshmallow/2,3?list=1\n :target: https://marshmallow.readthedocs.io/en/latest/upgrading.html\n :alt: marshmallow 2/3 compatible\n\n.. image:: https://badgen.net/badge/code%20style/black/000\n :target: https://github.com/ambv/black\n :alt: code style: black\n\n\nwebargs-starlette is a library for declarative request parsing and\nvalidation with `Starlette `_,\nbuilt on top of `webargs `_.\n\nIt has all the goodness of `webargs `_, \nwith some extra sugar for type annotations.\n\n.. code-block:: python\n\n import uvicorn\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from webargs_starlette import use_annotations\n\n app = Starlette()\n\n\n @app.route(\"/\")\n @use_annotations(locations=(\"query\",))\n async def index(request, name: str = \"World\"):\n return JSONResponse({\"Hello\": name})\n\n\n if __name__ == \"__main__\":\n uvicorn.run(app, port=5000)\n\n # curl 'http://localhost:5000/'\n # {\"Hello\": \"World\"}\n # curl 'http://localhost:5000/?name=Ada'\n # {\"Hello\": \"Ada\"}\n\nInstall\n=======\n\n::\n\n pip install -U webargs-starlette\n\n\nUsage\n=====\n\nParser Usage\n------------\n\nUse ``parser.parse`` to parse a Starlette ``Request`` with a\ndictionary of fields.\n\n.. code-block:: python\n\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from webargs import fields\n from webargs_starlette import parser\n\n app = Starlette()\n\n\n @app.route(\"/\")\n async def homepage(request):\n args = {\"name\": fields.Str(required=True), \"greeting\": fields.Str(missing=\"hello\")}\n parsed = await parser.parse(args, request)\n greeting = parsed[\"greeting\"]\n name = parsed[\"name\"]\n return JSONResponse({\"message\": f\"{greeting} {name}\"})\n\n\nDecorators\n----------\n\nUse the ``use_args`` decorator to inject the parsed arguments\ndictionary into the handler function. The following snippet is equivalent to the\nfirst example.\n\n**Important**: Decorated functions MUST be coroutine functions.\n\n.. code-block:: python\n\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from webargs import fields\n from webargs_starlette import use_args\n\n app = Starlette()\n\n\n @app.route(\"/\")\n @use_args({\"name\": fields.Str(required=True), \"greeting\": fields.Str(missing=\"hello\")})\n async def homepage(request, args):\n greeting = args[\"greeting\"]\n name = args[\"name\"]\n return JSONResponse({\"message\": f\"{greeting} {name}\"})\n\n\nThe ``use_kwargs`` decorator injects the parsed arguments as keyword arguments.\n\n.. code-block:: python\n\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from webargs import fields\n from webargs_starlette import use_args\n\n app = Starlette()\n\n\n @app.route(\"/\")\n @use_kwargs(\n {\"name\": fields.Str(required=True), \"greeting\": fields.Str(missing=\"hello\")}\n )\n async def homepage(request, name, greeting):\n return JSONResponse({\"message\": f\"{greeting} {name}\"})\n\n\nSee `decorator_example.py `_\nfor a more complete example of ``use_args`` and ``use_kwargs`` usage.\n\nError Handling\n--------------\n\nWhen validation fails, the parser will raise a ``WebargsHTTPException``,\nwhich is the same as Starlette's ``HTTPException`` with the addition of\nof the ``messages`` (validation messages), ``headers`` , ``exception`` (underlying exception), and ``schema`` (marshmallow ``Schema``) attributes.\n\nYou can use a custom exception handler to return the error messages as\nJSON.\n\n\n.. code-block:: python\n\n from starlette.responses import JSONResponse\n from webargs_starlette import WebargsHTTPException\n\n\n @app.exception_handler(WebargsHTTPException)\n async def http_exception(request, exc):\n return JSONResponse(exc.messages, status_code=exc.status_code, headers=exc.headers)\n\n\nAnnotations\n-----------\n\nThe ``use_annotations`` decorator allows you to parse request objects\nusing type annotations.\n\n\n.. code-block:: python\n\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from webargs_starlette import use_annotations\n\n app = Starlette()\n\n\n @app.route(\"/\")\n @use_annotations(locations=(\"query\",))\n async def welcome(request, name: str = \"Friend\"):\n return JSONResponse({\"message\": f\"Welcome, {name}!\"})\n\n\n # curl 'http://localhost:5000/'.\n # {\"message\":\"Welcome, Friend!\"}\n # curl 'http://localhost:5000/?name=Ada'.\n # {\"message\":\"Welcome, Ada!\"}\n\nAny annotated argument that doesn't have a default value will be required.\nFor example, if we remove the default for ``name`` in the above example,\nan 422 error response is returned if ``?name`` isn't passed.\n\n\n.. code-block:: python\n\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from webargs_starlette import use_annotations, WebargsHTTPException\n\n app = Starlette()\n\n\n @app.route(\"/\")\n @use_annotations(locations=(\"query\",))\n async def welcome(request, name: str):\n return JSONResponse({\"message\": f\"Welcome, {name}!\"})\n\n\n @app.exception_handler(WebargsHTTPException)\n async def http_exception(request, exc):\n return JSONResponse(exc.messages, status_code=exc.status_code, headers=exc.headers)\n\n\n # curl \"http://localhost:5000/\"\n # {\"name\":[\"Missing data for required field.\"]}\n\nArguments may also be annotated with ``Field`` instances when you need\nmore control. For example, you may want to add a validator.\n\n.. code-block:: python\n\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from webargs import fields\n from marshmallow import validate\n from webargs_starlette import use_annotations, WebargsHTTPException\n\n app = Starlette()\n\n\n @app.route(\"/\")\n @use_annotations(locations=(\"query\",))\n async def welcome(request, name: fields.Str(validate=validate.Length(min=2))):\n return JSONResponse({\"message\": f\"Welcome, {name}!\"})\n\n\n @app.exception_handler(WebargsHTTPException)\n async def http_exception(request, exc):\n return JSONResponse(exc.messages, status_code=exc.status_code, headers=exc.headers)\n\n\n # curl \"http://localhost:5000/?name=A\"\n # {\"name\":[\"Shorter than minimum length 2.\"]}\n\n``HTTPEndpoint`` classes may also be decorated with ``use_annotations``.\n\n.. code-block:: python\n\n from starlette.applications import Starlette\n from starlette.responses import JSONResponse\n from starlette.endpoints import HTTPEndpoint\n from webargs_starlette import use_annotations\n\n app = Starlette()\n\n\n @app.route(\"/\")\n @use_annotations(locations=(\"query\",))\n class WelcomeEndpoint(HTTPEndpoint):\n async def get(self, request, name: str = \"World\"):\n return JSONResponse({\"message\": f\"Welcome, {name}!\"})\n\nSee `annotation_example.py `_\nfor a more complete example of ``use_annotations`` usage.\n\nMore\n----\n\nFor more information on how to use webargs, see the `webargs documentation `_.\n\nLicense\n=======\n\nMIT licensed. See the `LICENSE `_ file for more details.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/sloria/webargs-starlette", "keywords": "webargs,starlette,asgi,request,parsing", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "webargs-starlette", "package_url": "https://pypi.org/project/webargs-starlette/", "platform": "", "project_url": "https://pypi.org/project/webargs-starlette/", "project_urls": { "Homepage": "https://github.com/sloria/webargs-starlette" }, "release_url": "https://pypi.org/project/webargs-starlette/1.2.0/", "requires_dist": [ "webargs (~=5.0)", "starlette (>=0.9.0)", "pytest ; extra == 'dev'", "mock ; extra == 'dev'", "webtest (~=2.0.32) ; extra == 'dev'", "webtest-asgi (~=1.0.1) ; extra == 'dev'", "mypy (==0.711) ; extra == 'dev'", "flake8 (==3.7.7) ; extra == 'dev'", "flake8-bugbear (==19.3.0) ; extra == 'dev'", "pre-commit (~=1.17) ; extra == 'dev'", "httpie ; extra == 'dev'", "uvicorn ; extra == 'dev'", "tox ; extra == 'dev'", "httpie ; extra == 'examples'", "uvicorn ; extra == 'examples'", "mypy (==0.711) ; extra == 'lint'", "flake8 (==3.7.7) ; extra == 'lint'", "flake8-bugbear (==19.3.0) ; extra == 'lint'", "pre-commit (~=1.17) ; extra == 'lint'", "pytest ; extra == 'tests'", "mock ; extra == 'tests'", "webtest (~=2.0.32) ; extra == 'tests'", "webtest-asgi (~=1.0.1) ; extra == 'tests'" ], "requires_python": "", "summary": "Declarative request parsing and validation for Starlette with webargs", "version": "1.2.0" }, "last_serial": 5492004, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "a6718d14d19022796f5ccb4cccb5394e", "sha256": "7239f55cb78ba159d021ffc4f3b17bbdad97ae1d12fb265dc5de88fc6e5ba203" }, "downloads": -1, "filename": "webargs_starlette-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a6718d14d19022796f5ccb4cccb5394e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6954, "upload_time": "2019-01-04T21:49:16", "url": "https://files.pythonhosted.org/packages/6d/e3/0b206a6d67303408f7e2e73a5edf985276df5c6cf05bd47538f1cfe1dfda/webargs_starlette-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "69f0f3a5e01f45502c51409e16a31a08", "sha256": "944e02701aa6a2c353f52863bafced9eecba25209bfb01064ae2e561efbbda6e" }, "downloads": -1, "filename": "webargs-starlette-1.0.0.tar.gz", "has_sig": false, "md5_digest": "69f0f3a5e01f45502c51409e16a31a08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7087, "upload_time": "2019-01-04T21:49:18", "url": "https://files.pythonhosted.org/packages/b1/04/256d142369970b818835cd1bdaba18fc35705636fb513e5eab664a7279af/webargs-starlette-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "352aca8490c73ab396f7f781c05003ff", "sha256": "7a58cf7c4de2818e2b8182304c29716f1a27f7779a83be439f3a7023c15c39e6" }, "downloads": -1, "filename": "webargs_starlette-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "352aca8490c73ab396f7f781c05003ff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8162, "upload_time": "2019-01-13T23:39:23", "url": "https://files.pythonhosted.org/packages/52/ea/f9808210e73f45267f8c3e208058864052505e7ee9106f5c44d7c8cf7c14/webargs_starlette-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e840255a0be6d9bfdfa3c53489371525", "sha256": "58a94ace958d1ec754d3df3e91191a361ec4c2e260589d64a257b030af008b1e" }, "downloads": -1, "filename": "webargs-starlette-1.1.0.tar.gz", "has_sig": false, "md5_digest": "e840255a0be6d9bfdfa3c53489371525", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7945, "upload_time": "2019-01-13T23:39:24", "url": "https://files.pythonhosted.org/packages/2a/fa/f6da2df8039e312e4746ae52eeba0551eb7d5da88600d88cf804248dd26e/webargs-starlette-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "677f3360e22898add88e05a04abfa102", "sha256": "543a4938621975371a480f395ed0c1902e86ef9f46d906416863e676b4d7fff3" }, "downloads": -1, "filename": "webargs_starlette-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "677f3360e22898add88e05a04abfa102", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8397, "upload_time": "2019-07-05T15:29:35", "url": "https://files.pythonhosted.org/packages/f4/64/7ffd80f9cff941bfaafba473bfc916d213f6d90b8efcc8c1e2d197558dba/webargs_starlette-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "086e78e63c4a37a915141e5eca8c6b98", "sha256": "92a167fbeff828588c507be673ccb2f60149eae0188e934809204c8b91f27557" }, "downloads": -1, "filename": "webargs-starlette-1.2.0.tar.gz", "has_sig": false, "md5_digest": "086e78e63c4a37a915141e5eca8c6b98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9432, "upload_time": "2019-07-05T15:29:36", "url": "https://files.pythonhosted.org/packages/1c/2e/bb75af8f8adf89f0a3e9f769e544cd9e2a81e65f9011ee8ccc2c6acec5b4/webargs-starlette-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "677f3360e22898add88e05a04abfa102", "sha256": "543a4938621975371a480f395ed0c1902e86ef9f46d906416863e676b4d7fff3" }, "downloads": -1, "filename": "webargs_starlette-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "677f3360e22898add88e05a04abfa102", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8397, "upload_time": "2019-07-05T15:29:35", "url": "https://files.pythonhosted.org/packages/f4/64/7ffd80f9cff941bfaafba473bfc916d213f6d90b8efcc8c1e2d197558dba/webargs_starlette-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "086e78e63c4a37a915141e5eca8c6b98", "sha256": "92a167fbeff828588c507be673ccb2f60149eae0188e934809204c8b91f27557" }, "downloads": -1, "filename": "webargs-starlette-1.2.0.tar.gz", "has_sig": false, "md5_digest": "086e78e63c4a37a915141e5eca8c6b98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9432, "upload_time": "2019-07-05T15:29:36", "url": "https://files.pythonhosted.org/packages/1c/2e/bb75af8f8adf89f0a3e9f769e544cd9e2a81e65f9011ee8ccc2c6acec5b4/webargs-starlette-1.2.0.tar.gz" } ] }