最快的 Python Web 框架入门

速度比较

框架

实现基础

每秒请求数

平均时间

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 Sanicfrom sanic.response import jsonapp = 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 Sanicfrom 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 Sanicfrom 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.middlewareasync 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 Sanicfrom sanic.exceptions import ServerError@app.route('/killme')def i_am_ready_to_die(request):    raise ServerError("Something bad happened")

处理异常

from sanic import Sanicfrom sanic.response import textfrom 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 jsonfrom sanic import Blueprintbp = Blueprint('my_blueprint')@bp.route('/')async def bp_root():    return json({'my': 'blueprint'})

蓝图注册到主app

from sanic import Sanicfrom my_blueprint import bpapp = Sanic(__name__)app.register_blueprint(bp)app.run(host='0.0.0.0', port=8000, debug=True)

总结

sanic将是一个非常流行的框架.因为它基于python3.5+,使用了许多新的特性,这些特性让程序速度更快。

  • 来自:编程派

原文发布于微信公众号 - 程序员宝库(chengxuyuanbaoku)

原文发表时间:2018-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DannyHoo的专栏

iOS中解决后台返回的null导致的崩溃问题--NullSafe

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1723
来自专栏闵开慧

java中线程安全

关于线程安全,是指当多个线程访问同一个变量时,该变量不会因为多线程访问产生意想不到的问题,为了避免多线程访问的不可预知的问题,对于程序中多线程能访问到的变量要加...

3317
来自专栏java一日一条

Java 类加载机制详解

Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器...

1041
来自专栏北京马哥教育

最快的 Python Web 框架入门

2585
来自专栏Java技术分享

Redis特性和应用场景

Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000...

2657
来自专栏ml

C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)

1. 首先,如何制作一个静态库(lib)?            额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件。之所以称之为lib...

8505
来自专栏大内老A

WCF服务端运行时架构体系详解[上篇]

WCF的服务端架构体系又可以成为服务寄宿端架构体系。我们知道,对于一个基于某种类型的服务进行寄宿只需要使用到一个唯一的对象,那就是ServiceHost。甚至在...

1959
来自专栏从零开始的linux

grep

grep文本过滤 命令选项: -v: 反向选取 -o: 仅显示匹配的字串,而非字串所在的行 ...

3124
来自专栏技术点滴

程序异常分析指南一、非法内存访问二、资源访问冲突三、程序异常解决方法总结参考资料

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异常的情况。程序崩溃时最常见的就是程序运行终止,报告Segmentation fault (core...

4553
来自专栏架构说

c++在编译中遇到符合不存在如何解决?

今日问题:symbol 不存在 : symbol lookup error: ./libinterface.so: undefined symbol: _ZN...

34815

扫码关注云+社区

领取腾讯云代金券