速度比较
框架 | 实现基础 | 每秒请求数 | 平均时间 |
Sanic | Python 3.5 + uvloop | 30,601 | 3.23ms |
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 |
安装
环境:python3.5+
python -m pip install sanic
Hello World
创建文件main.py,写入下面的内容
- from sanic import Sanic
- from sanic.response import json
- app = Sanic(__name__)
- @app.route("/")
- async def test(request):
- return json({ "hello": "world" })
- app.run(host="0.0.0.0", port=8000)
运行 python3 main.py
sanic是不是看起来和flask一样
Request
属性
request.files (dictionary of File objects) - 上传文件列表
request.json (any) - json数据
request.args (dict) - get数据
request.form (dict) - post表单数据
例子
- from sanic import Sanic
- from sanic.response import json
- @app.route("/json")
- def post_json(request):
- return json({ "received": True, "message": request.json })
- @app.route("/form")
- def post_json(request):
- return json({ "received": True, "form_data": request.form, "test": request.form.get('test') })
- @app.route("/files")
- def post_json(request):
- test_file = request.files.get('test')
- file_parameters = {
- 'body': test_file.body,
- 'name': test_file.name,
- 'type': test_file.type,
- }
- return json({ "received": True, "file_names": request.files.keys(), "test_file_parameters": file_parameters })
- @app.route("/query_string")
- def query_string(request):
- return json({ "parsed": True, "args": request.args, "url": request.url, "query_string": request.query_string })
路由
和flask差不多,一看就懂
- from sanic import Sanic
- from sanic.response import text
- @app.route('/tag/')
- async def person_handler(request, tag):
- return text('Tag - {}'.format(tag))
- @app.route('/number/')
- async def person_handler(request, integer_arg):
- return text('Integer - {}'.format(integer_arg))
- @app.route('/number/')
- async def person_handler(request, number_arg):
- return text('Number - {}'.format(number))
- @app.route('/person/')
- async def person_handler(request, name):
- return text('Person - {}'.format(name))
- @app.route('/folder/')
- async def folder_handler(request, folder_id):
- return text('Folder - {}'.format(folder_id))
注册中间件
- app = Sanic(__name__)
- @app.middleware
- async def halt_request(request):
- print("I am a spy")
- @app.middleware('request')
- async def halt_request(request):
- return text('I halted the request')
- @app.middleware('response')
- async def halt_response(request, response):
- return text('I halted the response')
- @app.route('/')
- async def handler(request):
- return text('I would like to speak now please')
- app.run(host="0.0.0.0", port=8000)
异常处理
抛出异常
- from sanic import Sanic
- from sanic.exceptions import ServerError
- @app.route('/killme')
- def i_am_ready_to_die(request):
- raise ServerError("Something bad happened")
处理异常
- from sanic import Sanic
- from sanic.response import text
- from sanic.exceptions import NotFound
- @app.exception(NotFound)
- def ignore_404s(request, exception):
- return text("Yep, I totally found the page: {}".format(request.url))
蓝图
和flask中的蓝图一样,用于组织项目结构
创建一个蓝图,相当于创建一个sanic app,上面的用法和上面相同,把app改成蓝图名称bp
- from sanic.response import json
- from sanic import Blueprint
- bp = Blueprint('my_blueprint')
- @bp.route('/')
- async def bp_root():
- return json({'my': 'blueprint'})
蓝图注册到主app
- from sanic import Sanic
- from my_blueprint import bp
- app = Sanic(__name__)
- app.register_blueprint(bp)
- app.run(host='0.0.0.0', port=8000, debug=True)
总结
sanic将是一个非常流行的框架.因为它基于python3.5+,使用了许多新的特性,这些特性让程序速度更快。
*声明:推送内容及图片来源于网络,部分内容会有所改动,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。