{ "info": { "author": "Jason Gerard DeRose", "author_email": "jderose@novacut.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: C", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: HTTP Servers", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Degu\n====\n\nDegu is an embedded HTTP server and client library for Python3.\n\nIt can be used to build network-transparent services, whether the other endpoint\nis in the cloud, on the local network, on the localhost, or even on the\nlocalhost using HTTP over ``AF_UNIX``.\n\nDegu is especially well suited for implementing REST APIs for device-to-device\ncommunication (Internet of Things). It's a building block for future stuff,\nyour vehicle into bold, uncharted territory.\n\nDegu is licensed `LGPLv3+`_, requires `Python 3.4`_ or newer, and fully\nsupports `Python 3.5`_.\n\nSome noteworthy features:\n\n * Degu fully exposes HTTP chunked transfer-encoding semantics, including\n the optional per-chunk *extension*\n\n * Degu fully exposes IPv6 address semantics, including the *scopeid*\n needed for IPv6 link-local addresses\n\n * Degu transparently supports ``AF_INET``, ``AF_INET6``, and ``AF_UNIX``,\n all via a single *address* argument used uniformly by the server and\n client\n\n * Degu provides a safe and opinionated API for using TLSv1.2, with a\n particular focus on using client certificates to authenticate incoming\n TCP connections\n\n\nExamples\n--------\n\nDefine a simple *REST Gateway Interface* (RGI) server application:\n\n>>> def app(session, request, api):\n... if request.method != 'GET':\n... return (405, 'Method Not Allowed', {}, None)\n... if request.path != ['example']:\n... return (404, 'Not Found', {}, None)\n... return (200, 'OK', {}, b'hello, world')\n...\n\nRun the above *app* on a throw-away server listening on a random, unprivileged\nport:\n\n>>> from degu.misc import TempServer\n>>> server = TempServer(('127.0.0.1', 0), app)\n\nCreate a client for making connections to the above server:\n\n>>> from degu.client import Client\n>>> client = Client(server.address)\n\n(The ``server.address`` attribute will include the random port assigned by the\nkernel.)\n\nCreate a connection and make a ``'GET'`` request:\n\n>>> conn = client.connect()\n>>> response = conn.get('/example', {})\n\nThe return value is a ``Response`` namedtuple:\n\n>>> response\nResponse(status=200, reason='OK', headers={'content-length': 12}, body=Body(, 12))\n\nRead the response body like this:\n\n>>> response.body.read()\nb'hello, world'\n\nMake another ``'GET'`` request, this time for a URI that will return a\n*404 Not Found* error:\n\n>>> conn.get('/nope', {})\nResponse(status=404, reason='Not Found', headers={}, body=None)\n\n\nDegu resources\n--------------\n\n * `Documentation`_\n * `Report a bug`_\n * `Browse the source`_\n * `Launchpad project`_\n\n\nPerformance\n-----------\n\nThe Degu server and client use a shared HTTP backend implemented in C. Degu\nis optimized for low-latency and high-throughput when operating at modest\nconcurrency.\n\nWhen both endpoints are running on the localhost, a Degu client+server duo is\nimpressively quick for small request/response made sequentially through the same\nconnection.\n\nOn an Intel i7-4900MQ CPU running Ubuntu 14.04 LTS (64-bit), Degu can achieve an\naverage of:\n\n * Over 76k request/response round-trips per second over ``AF_UNIX`` (less\n than 13.2\u03bcs per round-trip)\n\n * Over 53k request/response round-trips per second over ``AF_INET6`` (less\n than 18.9\u03bcs per round-trip)\n\nThis level of performance makes HTTP perfectly viable for Inter Process\nCommunication (IPC), with the added bonus that you get the same REST API\ngoodness whether the server is running locally or remotely.\n\n\nA Novacut component\n-------------------\n\nDegu is being developed as part of the `Novacut`_ project. Packages are\navailable for `Ubuntu`_ in the `Novacut Stable Releases PPA`_ and the\n`Novacut Daily Builds PPA`_.\n\nIf you have questions or need help getting started with Degu, please stop\nby the `#novacut`_ IRC channel on freenode.\n\n\n.. _`LGPLv3+`: https://www.gnu.org/licenses/lgpl-3.0.html\n.. _`Python 3.4`: https://docs.python.org/3.4/\n.. _`Python 3.5`: https://docs.python.org/3.5/\n\n.. _`Documentation`: http://docs.novacut.com/degu/index.html\n.. _`Report a bug`: https://bugs.launchpad.net/degu\n.. _`Browse the source`: http://bazaar.launchpad.net/~dmedia/degu/trunk/files\n.. _`Launchpad project`: https://launchpad.net/degu\n\n.. _`Novacut`: https://launchpad.net/novacut\n.. _`Ubuntu`: http://www.ubuntu.com/\n.. _`Novacut Stable Releases PPA`: https://launchpad.net/~novacut/+archive/ubuntu/stable\n.. _`Novacut Daily Builds PPA`: https://launchpad.net/~novacut/+archive/ubuntu/daily\n.. _`#novacut`: https://webchat.freenode.net/?channels=novacut", "description_content_type": null, "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://launchpad.net/degu", "keywords": null, "license": "LGPLv3+", "maintainer": null, "maintainer_email": null, "name": "degu", "package_url": "https://pypi.org/project/degu/", "platform": "POSIX", "project_url": "https://pypi.org/project/degu/", "project_urls": { "Homepage": "https://launchpad.net/degu" }, "release_url": "https://pypi.org/project/degu/0.18.0/", "requires_dist": null, "requires_python": null, "summary": "Embedded HTTP server and client library", "version": "0.18.0" }, "last_serial": 2540030, "releases": { "0.11.0": [ { "comment_text": "", "digests": { "md5": "42be855c9defe829ef30beacf34f3070", "sha256": "b8e9439e7f46d803d85a86d9c7d2d20085321541af7049b9c20333141ef04ac3" }, "downloads": -1, "filename": "degu-0.11.0.tar.gz", "has_sig": true, "md5_digest": "42be855c9defe829ef30beacf34f3070", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132937, "upload_time": "2014-11-23T05:54:46", "url": "https://files.pythonhosted.org/packages/b4/7a/9ab155f231d244b716cc561f637e002691318def15f00a247110376163ef/degu-0.11.0.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "1554caa90ccffab83fc7843d7324a90e", "sha256": "3a833f60b3a99223700b86f76c9730149a3b4136eb8cd224465ac3ffce36a435" }, "downloads": -1, "filename": "degu-0.12.0.tar.gz", "has_sig": true, "md5_digest": "1554caa90ccffab83fc7843d7324a90e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 140511, "upload_time": "2014-12-26T00:07:39", "url": "https://files.pythonhosted.org/packages/b1/60/59d9d659a440218b73a1df20bd342b29bd637fe3e5669f1e85a6f0ca086e/degu-0.12.0.tar.gz" } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "bfab2f86aeba71e894c9c76785e24a8e", "sha256": "5ec73ed807f4bcef9e83852105849ee93d0dca9398dee49e078f21bbd06ffbfd" }, "downloads": -1, "filename": "degu-0.13.0.tar.gz", "has_sig": true, "md5_digest": "bfab2f86aeba71e894c9c76785e24a8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 189814, "upload_time": "2015-07-19T18:47:45", "url": "https://files.pythonhosted.org/packages/26/ba/81a28bcbf88627a128c43d9cc5730df7751e4cf66dcd6b10470f38488096/degu-0.13.0.tar.gz" } ], "0.14.0": [ { "comment_text": "", "digests": { "md5": "ff864d44139c9cd6bd71028fa6b0c516", "sha256": "496d4130a01c0694787ead959af0d6d745697914119c6192375b20857e2da7c7" }, "downloads": -1, "filename": "degu-0.14.0.tar.gz", "has_sig": true, "md5_digest": "ff864d44139c9cd6bd71028fa6b0c516", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 195711, "upload_time": "2015-08-24T01:57:18", "url": "https://files.pythonhosted.org/packages/3e/25/33506baea58d415d8b30dda7113c9b41efef5edb53d1a5979eb61d7c576c/degu-0.14.0.tar.gz" } ], "0.15.0": [ { "comment_text": "", "digests": { "md5": "d7a734891a609b083f51ea66cfbf95df", "sha256": "2adf00a5762aa00650bea5f020ebfb401990ced5ecd8be859c1d3cf870db8008" }, "downloads": -1, "filename": "degu-0.15.0.tgz", "has_sig": true, "md5_digest": "d7a734891a609b083f51ea66cfbf95df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 202217, "upload_time": "2016-03-20T22:31:00", "url": "https://files.pythonhosted.org/packages/b1/3d/9c13f1dcd29c4aa9566b5dc3856265c14713250df0dedec496ee7bf988f3/degu-0.15.0.tgz" } ], "0.16.0": [ { "comment_text": "", "digests": { "md5": "53b2daf53a9d8fbdb8b492befe639801", "sha256": "5c7eaa579804e7f46e86b62ac212c9b4dc70744e302dc9fa92263ab7c5f25d92" }, "downloads": -1, "filename": "degu-0.16.0.tar.gz", "has_sig": true, "md5_digest": "53b2daf53a9d8fbdb8b492befe639801", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 209127, "upload_time": "2016-05-28T19:15:40", "url": "https://files.pythonhosted.org/packages/ca/7e/5e2da611970bef8236cc75bb6d937057d3f87bb54503c7d006e4dd01794d/degu-0.16.0.tar.gz" } ], "0.17.0": [ { "comment_text": "", "digests": { "md5": "5b9a1b5d286015be47439596764b4b0d", "sha256": "b6b3998f03c02aa3f44bc3a474997838058ff15276371535f3a2a3b0cbb033e8" }, "downloads": -1, "filename": "degu-0.17.0.tar.gz", "has_sig": true, "md5_digest": "5b9a1b5d286015be47439596764b4b0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 217279, "upload_time": "2016-10-02T20:51:56", "url": "https://files.pythonhosted.org/packages/e4/ca/cd5994c58e9be1808507f84354c8a6a127691ede3c3ffc37775cc8310dc7/degu-0.17.0.tar.gz" } ], "0.18.0": [ { "comment_text": "", "digests": { "md5": "3b97d14e4f051128124638806586dfb2", "sha256": "3085d4951e285ba137b77c38e3990227c9fd840bdff0d80e4ee4b7832cb80806" }, "downloads": -1, "filename": "degu-0.18.0.tar.gz", "has_sig": true, "md5_digest": "3b97d14e4f051128124638806586dfb2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 216967, "upload_time": "2016-12-26T21:45:02", "url": "https://files.pythonhosted.org/packages/0c/01/4dc62599898b4d79777b4b6ef0f94cbd253981b57b71f9d8172654d7dbea/degu-0.18.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3b97d14e4f051128124638806586dfb2", "sha256": "3085d4951e285ba137b77c38e3990227c9fd840bdff0d80e4ee4b7832cb80806" }, "downloads": -1, "filename": "degu-0.18.0.tar.gz", "has_sig": true, "md5_digest": "3b97d14e4f051128124638806586dfb2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 216967, "upload_time": "2016-12-26T21:45:02", "url": "https://files.pythonhosted.org/packages/0c/01/4dc62599898b4d79777b4b6ef0f94cbd253981b57b71f9d8172654d7dbea/degu-0.18.0.tar.gz" } ] }