Accelerate your web app development | Build fast. Run fast.
11f3c79a77
When user specifies HTTP methods to function handlers, it automatically will be overloaded unless they duplicate. Example: # This is a new route. It works as before. @app.route('/overload', methods=['GET']) async def handler1(request): return text('OK1') # This is the exiting route but a new method. They are merged and # work as combined. The route will serve all of GET, POST and PUT. @app.route('/overload', methods=['POST', 'PUT']) async def handler2(request): return text('OK2') # This is the existing route and PUT method is the duplicated method. # It raises RouteExists. @app.route('/overload', methods=['PUT', 'DELETE']) async def handler3(request): return text('Duplicated') |
||
---|---|---|
docs | ||
examples | ||
sanic | ||
tests | ||
.coveragerc | ||
.gitattributes | ||
.gitignore | ||
.travis.yml | ||
CHANGELOG.md | ||
LICENSE | ||
README.md | ||
requirements-dev.txt | ||
requirements.txt | ||
setup.py | ||
tox.ini |
Sanic
Sanic is a Flask-like Python 3.5+ web server that's written to go fast. It's based on the work done by the amazing folks at magicstack, and was inspired by this article: https://magic.io/blog/uvloop-blazing-fast-python-networking/.
On top of being Flask-like, Sanic supports async request handlers. This means you can use the new shiny async/await syntax from Python 3.5, making your code non-blocking and speedy.
Benchmarks
All tests were run on an AWS medium instance running ubuntu, using 1 process. Each script delivered a small JSON response and was tested with wrk using 100 connections. Pypy was tested for Falcon and Flask but did not speed up requests.
Server | Implementation | Requests/sec | Avg Latency |
---|---|---|---|
Sanic | Python 3.5 + uvloop | 33,342 | 2.96ms |
Wheezy | gunicorn + meinheld | 20,244 | 4.94ms |
Falcon | gunicorn + meinheld | 18,972 | 5.27ms |
Bottle | gunicorn + meinheld | 13,596 | 7.36ms |
Flask | gunicorn + meinheld | 4,988 | 20.08ms |
Kyoukai | Python 3.5 + uvloop | 3,889 | 27.44ms |
Aiohttp | Python 3.5 + uvloop | 2,979 | 33.42ms |
Tornado | Python 3.5 | 2,138 | 46.66ms |
Hello World
from sanic import Sanic
from sanic.response import json
app = Sanic()
@app.route("/")
async def test(request):
return json({"hello": "world"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
Installation
python -m pip install sanic
Documentation
- Getting started
- Request Data
- Routing
- Middleware
- Exceptions
- Blueprints
- Class Based Views
- Cookies
- Static Files
- Custom Protocol
- Testing
- Deploying
- Extensions
- Contributing
- License
TODO:
- Streamed file processing
- File output
- Examples of integrations with 3rd-party modules
- RESTful router
Limitations:
- No wheels for uvloop and httptools on Windows :(
Final Thoughts:
▄▄▄▄▄
▀▀▀██████▄▄▄ _______________
▄▄▄▄▄ █████████▄ / \
▀▀▀▀█████▌ ▀▐▄ ▀▐█ | Gotta go fast! |
▀▀█████▄▄ ▀██████▄██ | _________________/
▀▄▄▄▄▄ ▀▀█▄▀█════█▀ |/
▀▀▀▄ ▀▀███ ▀ ▄▄
▄███▀▀██▄████████▄ ▄▀▀▀▀▀▀█▌
██▀▄▄▄██▀▄███▀ ▀▀████ ▄██
▄▀▀▀▄██▄▀▀▌████▒▒▒▒▒▒███ ▌▄▄▀
▌ ▐▀████▐███▒▒▒▒▒▐██▌
▀▄▄▄▄▀ ▀▀████▒▒▒▒▄██▀
▀▀█████████▀
▄▄██▀██████▀█
▄██▀ ▀▀▀ █
▄█ ▐▌
▄▄▄▄█▌ ▀█▄▄▄▄▀▀▄
▌ ▐ ▀▀▄▄▄▀
▀▀▄▄▀