速度比较

框架 实现基础 每秒请求数 平均时间
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)

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+,使用了许多新的特性,这些特性让程序速度更快。


看完以上的内容,相信你对于Linux运维的了解又加深了一层。作为一名Linux爱好者,如果你在学习中遇到了困惑需要交流,可以来我们的网站(http://www.magedu.com/)获取帮助,了解行业评价最高的Linux课程可以拨打电话:18519746220。

最新文章

  1. Azure China (5) 管理Azure China Powershell
  2. DATETIME类型和BIGINT 类型互相转换
  3. 定时往oracle插入数据
  4. OidView
  5. JAVA学习:maven开发环境快速搭建
  6. 生动详细解释javascript的冒泡和捕获,包懂包会(转)
  7. 高性能CSS(二)
  8. WINHTTP的API接口说明。
  9. 必应代码搜索 Bing Code Search 安装
  10. 【JUnit4.10来源分析】6 Runner
  11. netty(5)高级篇-私有协议栈
  12. Linux常用命令大全(非常全!!!)
  13. mysql 分库分表 ~ ShardingSphere生态圈
  14. Android 获取版本号名称工具类
  15. 一个很适合初学者的selenium教程
  16. 如何在Mac的Finder中显示/usr,/tmp,/var等隐藏目录
  17. java并发编程目录
  18. S5PV210 串口配置与实验(轮询方式)
  19. TIDB-cenos7开发环境搭建
  20. C++ 多态的原理

热门文章

  1. 自己定义控件:onDraw 方法实现仿 iOS 的开关效果
  2. jvm 堆内存 栈内存 大小设置
  3. zoj3605 Find the Marble --- 概率dp
  4. LeetCode 7. Reverse Integer (倒转数字)
  5. Ubuntu12.04LTS 安装 eclipse
  6. BNU 13024 . Fi Binary Number 数位dp/fibonacci数列
  7. 【转】关于使用Android6.0编译程序时,出现getSlotFromBufferLocked: unknown buffer: 0xac0f8650问题的解释
  8. 【POJ 3714】 Raid
  9. perl数组的长度与元素个数
  10. 在PL/SQL使用游标获取数据及动态SQL