基于python3.5+的web框架s

发布时间:2019-10-16 17:29:49编辑:auto阅读(2780)

    简介

    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/<tag>')
    async def person_handler(request, tag):
        return text('Tag - {}'.format(tag))
    
    @app.route('/number/<integer_arg:int>')
    async def person_handler(request, integer_arg):
        return text('Integer - {}'.format(integer_arg))
    
    @app.route('/number/<number_arg:number>')
    async def person_handler(request, number_arg):
        return text('Number - {}'.format(number))
    
    @app.route('/person/<name:[A-z]>')
    async def person_handler(request, name):
        return text('Person - {}'.format(name))
    
    @app.route('/folder/<folder_id:[A-z0-9]{0,4}>')
    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+,使用了许多新的特性,这些特性让程序速度更快.

关键字