简介

sanic是一款用python3.5+写的web framework,用法和flask类似,sanic的特点是非常快
github官网:https://github.com/channelcat…

速度比较

框架 实现基础 每秒请求数 平均时间
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+,使用了许多新的特性,这些特性让程序速度更快.