{ "info": { "author": "gaojiuli", "author_email": "gaojiuli@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries", "Topic :: Internet :: WWW/HTTP :: HTTP Servers", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "# ![[logo](https://github.com/gaojiuli/xweb)](logo.png)\n\n\n![[Build](https://travis-ci.org/gaojiuli/xweb)](https://travis-ci.org/gaojiuli/xweb.svg?branch=master)\n![[License](https://pypi.python.org/pypi/xweb/)](https://img.shields.io/pypi/l/xweb.svg)\n![[Pypi](https://pypi.python.org/pypi/xweb/)](https://img.shields.io/pypi/v/xweb.svg)\n![[Python](https://pypi.python.org/pypi/xweb/)](https://img.shields.io/pypi/pyversions/xweb.svg)\n\nHigh performance web framework built with uvloop and httptools\n\nIn Xweb, everything is asynchronous.\n\n## Features\n\n- High performance.\n- Asynchronous.\n- Small.\n\n## Requirements\n\n- Python3.6+\n\n## Installation\n\n`pip install xweb`\n\n## Get Started\n\n### Hello World\n\n```python\nfrom xweb import App\n\napp = App()\n\n@app.use\nasync def response(ctx):\n ctx.res.body = \"Hello World\"\n\n\nif __name__ == '__main__':\n app.listen(8000)\n```\n\n### Example with middleware.\n\nA middleware is an async function or an async callable object which looks like: `async def logger(ctx, fn)`\n\n```python\n# app.py\n\nimport time\n\nfrom xweb import App\n\napp = App()\n\n\n@app.use\nasync def logger(ctx, fn):\n await fn()\n rt = ctx['X-Response-Time']\n print(rt)\n\n\n@app.use\nasync def response_time(ctx, fn):\n start = time.time()\n await fn()\n usage = (time.time() - start) * 1000_000\n ctx['X-Response-Time'] = f'{usage:.0f}\u00b5s'\n\n\n@app.use\nasync def response(ctx):\n ctx.res.body = \"Hello World\"\n\n\nif __name__ == '__main__':\n app.listen(8000)\n```\n\n## Middleware\n\n- [xweb-router](https://github.com/gaojiuli/xweb-router)\n\n## App\n\n- app.use(fn)\n- app.listen(host='127.0.0.1', port=8000, debug=True)\n\n## Context\n\n- ctx.req\n- ctx.res\n- ctx.send\n- ctx.abort(self, status, msg=\"\", properties=\"\")\n- ctx.check(self, value, status=400, msg='', properties=\"\")\n\n### Request\n\n`ctx.req` is a Request object.\n\n- ctx.req.headers dict\n- ctx.req.method str\n- ctx.req.url str\n- ctx.req.raw bytes\n- ctx.req.ip str\n\n### Response\n\n`ctx.res` is a Request object.\n\n- ctx.res.body str\n- ctx.res.status int\n- ctx.res.msg str\n- ctx.res.headers dict\n\n\n\n## Benchmark\n\n- Benchmark code in benchmarks/.\n- environment: `iMac (Retina 4K, 21.5-inch, 2017)`, `3 GHz Intel Core i5`, `8 GB 2400 MHz DDR4`\n- test command: `wrk http://127.0.0.1:8000/ -c 100 -t 10 -d 10 -T 10`\n\nFrameworks| Requests/Sec | Version\n-----|-----|-----\nxweb|100000|0.1.1\nvibora|90000|0.0.6\nmeinheld + wsgi|77000|0.6.1\nsanic|50000|0.7.0\n\n## Deploy and Run\n\n`python app.py`.\n\n## Test\n\n1. `pip install -r requirement.txt`\n2. `pytest --cov xweb.py`\n\n## Contributing\n\n\n### Build Middleware.\n\nXWeb is inspired by [koajs](https://koajs.com/). I need some help for writing middleware as in koa. For example:\n\n1. Body parser. Convert the raw bytes body into dict or file.\n2. Data validator. Async data validator with high performance.\n3. Router. High performance router like koa-router.\n4. etc..\n\n### Open issue.\n\n1. Suggestion.\n2. Bug.\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/gaojiuli/xweb", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "xweb", "package_url": "https://pypi.org/project/xweb/", "platform": "any", "project_url": "https://pypi.org/project/xweb/", "project_urls": { "Homepage": "https://github.com/gaojiuli/xweb" }, "release_url": "https://pypi.org/project/xweb/3.0.1/", "requires_dist": [ "asyncio", "ujson", "uvloop", "httptools", "gunicorn", "jsonschema" ], "requires_python": "", "summary": "High performance web framework built with uvloop and httptools.", "version": "3.0.1" }, "last_serial": 4464531, "releases": { "0.0.5": [ { "comment_text": "", "digests": { "md5": "dd477cece126732fe9d925e2d2eeae24", "sha256": "db84fd962cab23d6c8081967097b0b7a7f9ccb42a173e40da793f497e8bbfa42" }, "downloads": -1, "filename": "xweb-0.0.5.tar.gz", "has_sig": false, "md5_digest": "dd477cece126732fe9d925e2d2eeae24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5741, "upload_time": "2017-03-28T00:52:07", "url": "https://files.pythonhosted.org/packages/d9/f1/f50644707324c14e706623e03cab2bfb19408b02bf3e0418ae063e4e0ed2/xweb-0.0.5.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "14174d3c9f9c3f81ec7095a94fa760d2", "sha256": "97e08b395bd1d48ecdf1422265946e7a700afded705858a64ddc7c6bf6e202aa" }, "downloads": -1, "filename": "xweb-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "14174d3c9f9c3f81ec7095a94fa760d2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4266, "upload_time": "2018-09-29T08:50:52", "url": "https://files.pythonhosted.org/packages/5c/4f/f491160307a155a13e41caf059d7ebeb1182cdecbd92aa019de8e8cbec57/xweb-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2190dd973144cc45064915c77e1274d5", "sha256": "3716d1604c83333c225017152683363af82dc190b394e1c79d0f7b7304dcd41b" }, "downloads": -1, "filename": "xweb-0.1.0.tar.gz", "has_sig": false, "md5_digest": "2190dd973144cc45064915c77e1274d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4411, "upload_time": "2018-09-29T08:50:53", "url": "https://files.pythonhosted.org/packages/b8/94/c5735610a779d9903c959501789ae836cb5bd5772a51205026405d3b5507/xweb-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "46d5a9f13ab4581682c43fa798b85362", "sha256": "7c5b6bb78204457c8a4ea50879de3247358da02ba7de8ae55251a0c8a9314c57" }, "downloads": -1, "filename": "xweb-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "46d5a9f13ab4581682c43fa798b85362", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4446, "upload_time": "2018-09-30T05:58:07", "url": "https://files.pythonhosted.org/packages/df/8e/cc0f5383f0ae35d16d1ed605ebf139e9b6887466d430bf09f8b61dad6e52/xweb-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a5f62af9c6f9f92466250b41497780ed", "sha256": "90c5bbd15960903721707affcd2f7c8627a2ea9fd6146584ffc6c4fcc31fdbd2" }, "downloads": -1, "filename": "xweb-0.1.1.tar.gz", "has_sig": false, "md5_digest": "a5f62af9c6f9f92466250b41497780ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4590, "upload_time": "2018-09-30T05:58:10", "url": "https://files.pythonhosted.org/packages/f3/71/d978ae7b5f5c9a236858a51e60429cbae724e4011bf11a62be05019d40bd/xweb-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "30f61af76f45199116747cf3feda1e53", "sha256": "a7d70ff0f025f40cbafdef2dfb9782fc937d3b9ba7992b9cc908aea1c0072358" }, "downloads": -1, "filename": "xweb-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "30f61af76f45199116747cf3feda1e53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4538, "upload_time": "2018-09-30T08:39:58", "url": "https://files.pythonhosted.org/packages/e4/ca/c3d4603da3127826a2acd6db9177c58aee913e517dad23dc16175d9ffeae/xweb-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "10a6fb1a6852d71a1de43179c376d366", "sha256": "383cf3c1945e672faecc35cba0216a9b6ce267549a91adda1369058b283239a4" }, "downloads": -1, "filename": "xweb-0.1.2.tar.gz", "has_sig": false, "md5_digest": "10a6fb1a6852d71a1de43179c376d366", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4738, "upload_time": "2018-09-30T08:40:00", "url": "https://files.pythonhosted.org/packages/74/3f/a5615cb14cd6f5be04515a2f64e619caa6b2b60888b990318fb292bdd5d7/xweb-0.1.2.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "090c037e59cc1fc040c3f312de86bd10", "sha256": "1900d9306be9e42bd6aecd2dd07dad022b3ea4cc06feb94ca84bb8752889a85d" }, "downloads": -1, "filename": "xweb-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "090c037e59cc1fc040c3f312de86bd10", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4591, "upload_time": "2018-10-06T08:12:39", "url": "https://files.pythonhosted.org/packages/3d/19/bda2183d4e949a30dc94584f1c1a3eeafb4f8fe3e932c9be81fd99f7c5e8/xweb-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "263b3a8cd239fb787df232b8ee61adaa", "sha256": "0cf8db5bec4be9cfce796527ef58dce7aee4a1e0ad28d085fab2a9cbce501331" }, "downloads": -1, "filename": "xweb-0.1.4.tar.gz", "has_sig": false, "md5_digest": "263b3a8cd239fb787df232b8ee61adaa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4794, "upload_time": "2018-10-06T08:12:42", "url": "https://files.pythonhosted.org/packages/8d/f5/1212c3b3e3d5855f0c03b6674900a59bd5245002bab8e55e68622deb40ef/xweb-0.1.4.tar.gz" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "5309fee9d1ca3e9d32f38999e1721909", "sha256": "473a4f1ec92718d4d3d7bc1a6b4b4c02fcd20d9d225dada2c47bac3502251f06" }, "downloads": -1, "filename": "xweb-3.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5309fee9d1ca3e9d32f38999e1721909", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4601, "upload_time": "2018-11-08T07:05:02", "url": "https://files.pythonhosted.org/packages/db/57/6bf917b79f328211be3c271eb909ed89233dcdc782c2efa2875b70e8c8b8/xweb-3.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fd8f687c267c60051b31c218f0a87404", "sha256": "b58ff46af924cb2151a97c896ad9b59a29b4e925263a58c9f66c77b17068addc" }, "downloads": -1, "filename": "xweb-3.0.0.tar.gz", "has_sig": false, "md5_digest": "fd8f687c267c60051b31c218f0a87404", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4816, "upload_time": "2018-11-08T07:05:05", "url": "https://files.pythonhosted.org/packages/6e/c6/077eeffb80028a0dc330962d8e3656a5fb3fdc7457feada218b8d60e63cc/xweb-3.0.0.tar.gz" } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "1c2caab0af8b8601bac15e594f2f360a", "sha256": "8a7eeb0616cc07c48801a97fc6107082554cc5cfac7ff1e80d09c4248bbacb3d" }, "downloads": -1, "filename": "xweb-3.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1c2caab0af8b8601bac15e594f2f360a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5412, "upload_time": "2018-11-08T07:33:08", "url": "https://files.pythonhosted.org/packages/1e/bf/f2e7433df95e6293657baff988925ef3208afb5ff59fee7b301c9decb911/xweb-3.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0a305ea781e63927b2c40d7223394469", "sha256": "a2e72496996d526bade4a734d4877bba9d0850b700e59542c16e92fc01cacb6e" }, "downloads": -1, "filename": "xweb-3.0.1.tar.gz", "has_sig": false, "md5_digest": "0a305ea781e63927b2c40d7223394469", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4823, "upload_time": "2018-11-08T07:33:09", "url": "https://files.pythonhosted.org/packages/15/79/c75201fc28e377e850f0d16a5934fdc86109b98c4ac9e0f8af49d361eee1/xweb-3.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1c2caab0af8b8601bac15e594f2f360a", "sha256": "8a7eeb0616cc07c48801a97fc6107082554cc5cfac7ff1e80d09c4248bbacb3d" }, "downloads": -1, "filename": "xweb-3.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1c2caab0af8b8601bac15e594f2f360a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5412, "upload_time": "2018-11-08T07:33:08", "url": "https://files.pythonhosted.org/packages/1e/bf/f2e7433df95e6293657baff988925ef3208afb5ff59fee7b301c9decb911/xweb-3.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0a305ea781e63927b2c40d7223394469", "sha256": "a2e72496996d526bade4a734d4877bba9d0850b700e59542c16e92fc01cacb6e" }, "downloads": -1, "filename": "xweb-3.0.1.tar.gz", "has_sig": false, "md5_digest": "0a305ea781e63927b2c40d7223394469", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4823, "upload_time": "2018-11-08T07:33:09", "url": "https://files.pythonhosted.org/packages/15/79/c75201fc28e377e850f0d16a5934fdc86109b98c4ac9e0f8af49d361eee1/xweb-3.0.1.tar.gz" } ] }