{ "info": { "author": "Dustin Ingram", "author_email": "di@di.codes", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "Flask-Accept\n============\n\n.. image:: https://travis-ci.org/di/flask-accept.svg?branch=master\n :target: https://travis-ci.org/di/flask-accept\n\nDescription\n-----------\n\nCustom ``Accept`` header routing support for Flask.\n\nFeatures\n--------\n\n**Respond differently based on the MIME type accepted**\n Extend any given endpoint to support any additional media type.\n\n**Use custom media types to version your API**\n Never put a ``/v1/`` in your URI ever again.\n\n**Dead-simple API**\n Yet Another Flask Decorator.\n\nDocumentation\n-------------\n\nInstallation\n~~~~~~~~~~~~\n\nInstalling:\n\n::\n\n $ pip install flask-accept\n\nQuickstart\n~~~~~~~~~~\n\nBelow is an example Flask app that only accepts the ``text/html`` media type:\n\n.. code:: python\n\n from flask import Flask\n from flask_accept import accept\n app = Flask(__name__)\n\n @app.route('/')\n @accept('text/html')\n def hello_world():\n return 'Hello World!'\n\n if __name__ == '__main__':\n app.run()\n\nWhen one tries to access the endpoint without a valid ``Accept`` header:\n\n.. code:: console\n\n $ curl localhost:5000 -I\n HTTP/1.0 406 NOT ACCEPTABLE\n\nWith the valid header:\n\n.. code:: console\n\n $ curl localhost:5000 -I -H \"Accept: text/html\"\n HTTP/1.0 200 OK\n Content-Type: text/html; charset=utf-8\n\nAdding Support for an Existing Endpoint\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGiven our example from before, we can add support for a different response to\nan additonal media type as follows:\n\n.. code:: python\n\n from flask import Flask, jsonify\n from flask_accept import accept\n app = Flask(__name__)\n\n @app.route('/')\n @accept('text/html')\n def hello_world():\n return 'Hello World!'\n\n @hello_world.support('application/json')\n def hello_world_json():\n return jsonify(result=\"Hello World!\")\n\n if __name__ == '__main__':\n app.run()\n\nNow our ``hello_world`` endpoint supports JSON:\n\n.. code:: console\n\n $ curl localhost:5000 -I -H \"Accept: application/json\"\n HTTP/1.0 200 OK\n Content-Type: application/json\n\nFalling Back on a Default Endpoint\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf we want to support a specific media type, but have every other request\nfall back to a default endpoint, we can use ``accept_fallback`` as follows:\n\n.. code:: python\n\n from flask import Flask, jsonify\n from flask_accept import accept, accept_fallback\n app = Flask(__name__)\n\n @app.route('/')\n @accept_fallback\n def hello_world():\n return 'Hello World!'\n\n @hello_world.support('application/json')\n def hello_world_json():\n return jsonify(result=\"Hello World!\")\n\n if __name__ == '__main__':\n app.run()\n\nOur ``hello_world`` endpoint still supports JSON, but for any other media type\n(or if none is specified) it will fall back:\n\n.. code:: console\n\n $ curl localhost:5000 -I\n HTTP/1.0 200 OK\n Content-Type: text/html\n\n $ curl localhost:5000 -I -H \"Accept: madeup/mediatype\"\n HTTP/1.0 200 OK\n Content-Type: text/html\n\nUse Cases\n~~~~~~~~~\n\nSome possible use cases for Flask-Accept.\n\nVersioning your API\n^^^^^^^^^^^^^^^^^^^\n\nFlask-Accept let you accept any possible media type, including `custom vendored\nmedia types `_. This is\nideal for versioning an API using ``Accept`` headers only:\n\n.. code:: python\n\n from flask import Flask, jsonify\n from flask_accept import accept\n app = Flask(__name__)\n\n @app.route('/')\n @accept('application/vnd.your_vendor.v1', 'application/vnd.your_vendor.v2')\n def hello_world():\n return 'Hello World!'\n\n @hello_world.support('application/vnd.your_vendor.v3')\n def hello_world_v2():\n return 'Goodbye cruel world.'\n\n if __name__ == '__main__':\n app.run()\n\n.. code:: console\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v1\"\n Hello World!\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v2\"\n Hello World!\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v3\"\n Goodbye cruel world.\n\nWorks with Flask-RESTful Resources\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe same functionality can be applied to APIs built with Flask-RESTful\n\n.. code:: python\n\n from flask import Flask, jsonify\n from flask_accept import accept\n from flask_restful import Resource, Api\n app = Flask(__name__)\n api = Api(app)\n\n\n class HelloWorldResource(Resource):\n @accept('application/vnd.your_vendor.v1', 'application/vnd.your_vendor.v2')\n def get():\n return 'Hello World!'\n\n @get.support('application/vnd.your_vendor.v3')\n def get_v2():\n return 'Goodbye cruel world.'\n\n\n api.add_resource(HelloWorldResource, '/')\n\n if __name__ == '__main__':\n app.run()\n\n.. code:: console\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v1\"\n Hello World!\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v2\"\n Hello World!\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v3\"\n Goodbye cruel world.\n\nWorks with Flask-RESTPlus Resources\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe same functionality can be applied to APIs built with `Flask-RESTPlus `_\n\n.. code:: python\n\n from flask import Flask, jsonify\n from flask_accept import accept\n from flask_restplus import Resource, Api\n app = Flask(__name__)\n api = Api(app)\n\n\n class HelloWorldResource(Resource):\n @accept('application/vnd.your_vendor.v1', 'application/vnd.your_vendor.v2')\n def get():\n \"\"\"\n The doc string showing in swagger\n \"\"\"\n return 'Hello World!'\n\n @get.support('application/vnd.your_vendor.v3')\n def get_v2():\n return 'Goodbye cruel world.'\n\n\n api.add_resource(HelloWorldResource, '/')\n\n if __name__ == '__main__':\n app.run()\n\n.. code:: console\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v1\"\n Hello World!\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v2\"\n Hello World!\n\n $ curl localhost:5000 -H \"Accept: application/vnd.your_vendor.v3\"\n Goodbye cruel world.\n\n\nTesting\n~~~~~~~\n\nTo run the tests\n\n::\n\n python setup.py test\n\nAuthors\n-------\n\n- `Dustin Ingram `_\n- `Patrick Smith `_\n- `Antonio Yang `_\n\nLicense\n-------\n\nOpen source MIT license.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/di/flask-accept", "keywords": "flask accept mimetype headers api versioning", "license": "", "maintainer": "", "maintainer_email": "", "name": "flask_accept", "package_url": "https://pypi.org/project/flask_accept/", "platform": "", "project_url": "https://pypi.org/project/flask_accept/", "project_urls": { "Homepage": "http://github.com/di/flask-accept" }, "release_url": "https://pypi.org/project/flask_accept/0.0.6/", "requires_dist": [ "flask" ], "requires_python": "", "summary": "Custom Accept header routing support for Flask", "version": "0.0.6" }, "last_serial": 4007723, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "d132de3737572e0825e8a04e35f297ee", "sha256": "9983d1c8c487bbdf164c94c98cf2d1278a3e9d56d2ebcd3dfdce4f754fcbfe11" }, "downloads": -1, "filename": "flask_accept-0.0.1.tar.gz", "has_sig": false, "md5_digest": "d132de3737572e0825e8a04e35f297ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3801, "upload_time": "2015-11-17T20:36:14", "url": "https://files.pythonhosted.org/packages/7c/9f/134b5f6260bc0991ca5081a4fa261032c870c7859391d994cc807fc174e3/flask_accept-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "994253ab835e6332379e78803922b882", "sha256": "f61e72fe4422fad9be83bd59899b45cef1d11d83268e2fd183912df3b981b29d" }, "downloads": -1, "filename": "flask_accept-0.0.2.tar.gz", "has_sig": false, "md5_digest": "994253ab835e6332379e78803922b882", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3800, "upload_time": "2015-11-17T20:49:04", "url": "https://files.pythonhosted.org/packages/c8/ac/2f3e71dfd024f807e2cce4b17879010a966b58a35ad53f2d55faf9b79da5/flask_accept-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "1fcced2eca82aa5897908b0bc70587d7", "sha256": "894d4b6709362795971cb645c905b1ab30338b5af20d90b567dc85cdda3ae2e1" }, "downloads": -1, "filename": "flask_accept-0.0.3.tar.gz", "has_sig": false, "md5_digest": "1fcced2eca82aa5897908b0bc70587d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3804, "upload_time": "2015-11-18T19:41:36", "url": "https://files.pythonhosted.org/packages/4d/cb/51eb3568c3ba575b30ba11040930f10c79da5a9f1aaadac08c0186bb8a83/flask_accept-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "3dee89455fdba1e14590788fe723f51b", "sha256": "e4abfdd2f15b3361992e4f531d666e9104a71a158aca1fdc0d3bda9525e8434c" }, "downloads": -1, "filename": "flask_accept-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "3dee89455fdba1e14590788fe723f51b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5706, "upload_time": "2017-11-14T22:26:00", "url": "https://files.pythonhosted.org/packages/98/d6/b2ce16b9918002393a366aa62225d4ca544ad23fc23ea92ed1ad3fa6afa8/flask_accept-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "817c633c1f98373f608ab0598b5ff893", "sha256": "e2c636904a2cbff6ca9db5ea70e09be1480b3c2d50ab011d9bfa4d96c7456a4c" }, "downloads": -1, "filename": "flask_accept-0.0.4.tar.gz", "has_sig": false, "md5_digest": "817c633c1f98373f608ab0598b5ff893", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3868, "upload_time": "2017-11-14T22:26:01", "url": "https://files.pythonhosted.org/packages/1d/34/d4f8e174f43c00c2c681c776e3a5340aac0cb478cea4ecc4236583a84a62/flask_accept-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "b22e6d68b8bee5a25e8c96db1ec0e905", "sha256": "9c8e995b97e9c2a5ee90a81c3ed8256c4159a64ba510380979403f354a09daa5" }, "downloads": -1, "filename": "flask_accept-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "b22e6d68b8bee5a25e8c96db1ec0e905", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6055, "upload_time": "2018-03-15T16:57:07", "url": "https://files.pythonhosted.org/packages/d0/c4/1e382728132d86bd05cfcfa0f7ab3df1ebd82fa4a1fcbfbd92e515acfc2e/flask_accept-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "160382199fbdff3607445553ef2b7ebb", "sha256": "867187f48920be2fc7081de7a7299e86b0b8f0eeabf812bbe7174555ebce1972" }, "downloads": -1, "filename": "flask_accept-0.0.5.tar.gz", "has_sig": false, "md5_digest": "160382199fbdff3607445553ef2b7ebb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4141, "upload_time": "2018-03-15T16:57:09", "url": "https://files.pythonhosted.org/packages/65/29/57d945412960210734b2da5a0f3268395d8ba07aa7bb44c5f9aa69526b05/flask_accept-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "38a2ed19eab75283cfa5c530933de9fb", "sha256": "4be4c34aa0a13bb56427e45426297858e3d189bebac415b88694e6489f61d1e0" }, "downloads": -1, "filename": "flask_accept-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "38a2ed19eab75283cfa5c530933de9fb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3789, "upload_time": "2018-06-27T14:30:56", "url": "https://files.pythonhosted.org/packages/61/49/947363e334a62787e10b9ccc5ce3f3578866bf56704900b53054f2778d61/flask_accept-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "12104e475169af6fbace0388d3314850", "sha256": "be48f7d805f1a9dadeabce0fd166404eda92da8d2cf1945237aff278238f4c70" }, "downloads": -1, "filename": "flask_accept-0.0.6.tar.gz", "has_sig": false, "md5_digest": "12104e475169af6fbace0388d3314850", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4380, "upload_time": "2018-06-27T14:30:57", "url": "https://files.pythonhosted.org/packages/0a/54/de4111e7ef8450bbfec187cd8e066134b2b46df679b0ad59221fd421d26d/flask_accept-0.0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "38a2ed19eab75283cfa5c530933de9fb", "sha256": "4be4c34aa0a13bb56427e45426297858e3d189bebac415b88694e6489f61d1e0" }, "downloads": -1, "filename": "flask_accept-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "38a2ed19eab75283cfa5c530933de9fb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3789, "upload_time": "2018-06-27T14:30:56", "url": "https://files.pythonhosted.org/packages/61/49/947363e334a62787e10b9ccc5ce3f3578866bf56704900b53054f2778d61/flask_accept-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "12104e475169af6fbace0388d3314850", "sha256": "be48f7d805f1a9dadeabce0fd166404eda92da8d2cf1945237aff278238f4c70" }, "downloads": -1, "filename": "flask_accept-0.0.6.tar.gz", "has_sig": false, "md5_digest": "12104e475169af6fbace0388d3314850", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4380, "upload_time": "2018-06-27T14:30:57", "url": "https://files.pythonhosted.org/packages/0a/54/de4111e7ef8450bbfec187cd8e066134b2b46df679b0ad59221fd421d26d/flask_accept-0.0.6.tar.gz" } ] }