python数据处理框架_python 最快 web 框架 Sanci 快速入门

简介

Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快。

除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求。这意味着你可以使用新的 async/await 语法,编写非阻塞的快速的代码。

关于 asyncio 包的介绍,请参考之前的一篇文章 python并发2:使用asyncio处理并发

既然它说速度特别快,我们先看下官方提供的 基准测试结果。

Sanic基准测试

1460000009920159?w=547&h=362

这个测试的程序运行在 AWS 实例上,系统是Ubuntu,只使用了一个进程。

那我们就有必要看下uvloop是个什么库。

uvloop

uvloop 是 asyncio 默认事件循环的替代品,实现的功能完整,切即插即用。uvloop是用CPython 写的,建于libuv之上。

uvloop 可以使 asyncio 更快。事实上,它至少比 nodejs、gevent 和其他 Python 异步框架要快两倍 。基于 uvloop 的 asyncio 的速度几乎接近了 Go 程序的速度。

安装 uvloop

uvloop 还只能在 *nix 平台 和 Python3.5+以上版本使用。

使用pip安装:

pip install uvloop

在 asyncio 代码中使用uvloop 也很简单:

import asyncio

import uvloop

asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

这得代码使得对任何asyncio.get_event_loop() 的调用都将返回一个uvloop实例。

现在我们开始学习Sanic:

安装 Sanic

pip install sanic

创建第一个 sanic 代码

from sanic import Sanic

from sanic.response import text

app = Sanic(__name__)

@app.route("/")

async def test(request):

return text('Hello world!')

app.run(host="0.0.0.0", port=8000, debug=True)

运行代码: python main.py, 现在打开浏览器访问 http://0.0.0.0:8000,你会看到 hello world!。

如果你熟悉Flask,你会发现,这个语法简直和Flask一模一样。

路由(Routing)

路由用于把一个函数绑定到一个 URL。下面是一些基本的例子:

@app.route('/')

def index():

return text('Index Page')

@app.route('/hello')

def hello():

return text('Hello World')

当然,你还可以动态的变化URL的某些部分,还可以为一个函数指定多个规则。

变量规则

通过把 URL 的一部分标记为 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 ,可以 选择性的加上一个转换器,为变量指定特定的类型,如果传入的类型错误,Sanic会抛出NotFound异常。请看下面的例子:

from sanic.response import text

@app.route('/tag/')

async def tag_handler(request, tag):

return text('Tag - {}'.format(tag))

@app.route('/number/')

async def integer_handler(request, integer_arg):

return text('Integer - {}'.format(integer_arg))

@app.route('/number/')

async def number_handler(request, number_arg):

return text('Number - {}'.format(number_arg))

@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))

HTTP 请求类型

默认情况下,我们定义的URL只支持GET 请求,@app.route装饰器提供了一个可选参数methods,这个参数允许传入所有HTTP 方法。

例如:

from sanic.response import text

@app.route('/post', methods=['POST'])

async def post_handler(request):

return text('POST request - {}'.format(request.json))

@app.route('/get', methods=['GET'])

async def get_handler(request):

return text('GET request - {}'.format(request.args))

也可以简写为:

from sanic.response import text

@app.post('/post')

async def post_handler(request):

return text('POST request - {}'.format(request.json))

@app.get('/get')

async def get_handler(request):

return text('GET request - {}'.format(request.args))

add_route 方法

除了@app.route装饰器,Sanic 还提供了 add_route 方法。

@app.route 只是包装了 add_route方法。

from sanic.response import text

# Define the handler functions

async def handler1(request):

return text('OK')

async def handler2(request, name):

return text('Folder - {}'.format(name))

async def person_handler2(request, name):

return text('Person - {}'.format(name))

# Add each handler function as a route

app.add_route(handler1, '/test')

app.add_route(handler2, '/folder/')

app.add_route(person_handler2, '/person/', methods=['GET'])

URL 构建

如果可以匹配URL,那么Sanic可以生成URL吗?当然可以,url_for() 函数就是用于构建指定函数的URL的。它把函数名称作为第一个参数,其余参数对应URL中的变量,例如:

@app.route('/')

async def index(request):

# generate a URL for the endpoint `post_handler`

url = app.url_for('post_handler', post_id=5)

# the URL is `/posts/5`, redirect to it

return redirect(url)

@app.route('/posts/')

async def post_handler(request, post_id):

return text('Post - {}'.format(post_id))

未定义变量会作为URL的查询参数:

url = app.url_for('post_handler', post_id=5, arg_one='one', arg_two='two')

# /posts/5?arg_one=one&arg_two=two

# 支持多值参数

url = app.url_for('post_handler', post_id=5, arg_one=['one', 'two'])

# /posts/5?arg_one=one&arg_one=two

使用蓝图(Blueprint)

Sanic也提供了和Flask 类似的 Blueprint。

Blueprint有以下用途:

把一个应用分解为一套蓝图。这是针对大型应用的理想方案:一个项目可以实例化一个 应用,初始化多个扩展,并注册许多蓝图。

在一个应用的 URL 前缀和(或)子域上注册一个蓝图。 URL 前缀和(或)子域的参数 成为蓝图中所有视图的通用视图参数(缺省情况下)。

使用不同的 URL 规则在应用中多次注册蓝图。

通过蓝图提供模板过滤器、静态文件、模板和其他工具。蓝图不必执行应用或视图 函数。

blueprint 示例

from sanic import Sanic

from sanic.response import json

from sanic import Blueprint

bp = Blueprint('my_blueprint')

@bp.route('/')

async def bp_root(request):

return json({'my': 'blueprint'})

app = Sanic(__name__)

app.blueprint(bp)

app.run(host='0.0.0.0', port=8000, debug=True)

Sanic 使用 app.blueprint() 方法注册blueprint。

使用蓝图注册全局中间件

@bp.middleware

async def print_on_request(request):

print("I am a spy")

@bp.middleware('request')

async def halt_request(request):

return text('I halted the request')

@bp.middleware('response')

async def halt_response(request, response):

return text('I halted the response')

使用蓝图处理异常

@bp.exception(NotFound)

def ignore_404s(request, exception):

return text("Yep, I totally found the page: {}".format(request.url))

使用蓝图处理静态文件

第一个参数指向当前的Python包

第二个参数是静态文件的目录

bp.static('/folder/to/serve', '/web/path')

使用url_for

如果要创建页面链接,可以和通常一样使用 url_for() 函数,只是要把蓝图名称作为端点的前缀,并且用一个点( . )来 分隔:

@blueprint_v1.route('/')

async def root(request):

url = app.url_for('v1.post_handler', post_id=5) # --> '/v1/post/5'

return redirect(url)

@blueprint_v1.route('/post/')

async def post_handler(request, post_id):

return text('Post {} in Blueprint V1'.format(post_id))

操作请求数据

对于web 应用来说对客户端向服务器发送的数据做出相应很重要,在Sanic中由传入的参数 request来提供请求信息。

为什么不像Flask 一样提供一个全局变量 request?

Flask 是同步请求,每次请求都有一个独立的新线程来处理,这个线程中也只处理这一个请求。而Sanic是基于协程的处理方式,一个线程可以同时处理几个、几十个甚至几百个请求,把request作为全局变量显然会比较难以处理。

Request 对象常用参数有

json(any) json body

from sanic.response import json

@app.route("/json")

def post_json(request):

return json({ "received": True, "message": request.json })

args(dict) URL请求参数

?key1=value1&key2=value2 将转变为

{'key1': ['value1'], 'key2': ['value2']}

raw_args(dict) 和args 类似

?key1=value1&key2=value2 将转变为

{'key1': 'value1', 'key2': 'value2'}

form(dict)处理 POST 表单请求,数据是一个字典

body(bytes)处理POST 表单请求,数据是一个字符串

其他参数还有:

file

ip

app

url

scheme

path

query_string

关于响应

Sanic使用response 函数创建响应对象。

文本 response.text('hello world')

html response.html('

hello world

')

json response.json({'hello': 'world'})

file response.file('/srv/www/hello.txt')

streaming

from sanic import response

@app.route("/streaming")

async def index(request):

async def streaming_fn(response):

response.write('foo')

response.write('bar')

return response.stream(streaming_fn, content_type='text/plain')

redirect response.file('/json')

raw response.raw('raw data')

如果想修改响应的headers可以传入headers 参数

from sanic import response

@app.route('/json')

def handle_request(request):

return response.json(

{'message': 'Hello world!'},

headers={'X-Served-By': 'sanic'},

status=200

)

配置管理

应用总是需要一定的配置的。根据应用环境不同,会需要不同的配置。比如开关调试 模式、设置密钥以及其他依赖于环境的东西。

Sanic 的设计思路是在应用开始时载入配置。你可以在代码中直接硬编码写入配置,也可以使用配置文件。

不管你使用何种方式载入配置,都可以使用 Sanic 的 config 属性来操作配置的值。 Sanic 本身就使用这个对象来保存 一些配置,扩展也可以使用这个对象保存配置。同时这也是你保存配置的地方。

配置入门

config 实质上是一个字典的子类,可以像字典一样操作:

app = Sanic('myapp')

app.config.DB_NAME = 'appdb'

app.config.DB_USER = 'appuser'

也可以一次更新多个配置:

db_settings = {

'DB_HOST': 'localhost',

'DB_NAME': 'appdb',

'DB_USER': 'appuser'

}

app.config.update(db_settings)

从对象导入配置

import myapp.default_settings

app = Sanic('myapp')

app.config.from_object(myapp.default_settings)

使用配置文件

如果把配置放在一个单独的文件中会更有用。理想情况下配置文件应当放在应用包的 外面。这样可以在修改配置文件时不影响应用的打包与分发

常见用法如下:

app = Sanic('myapp')

app.config.from_envvar('MYAPP_SETTINGS')

首先从 myapp.default_settings 模块载入配置,然后根据 MYAPP_SETTINGS 环境变量所指向的文件的内容重载配置的值。在 启动服务器前,在 Linux 或 OS X 操作系统中,这个环境变量可以在终端中使用 export 命令来设置:

$ export MYAPP_SETTINGS=/path/to/config_file

$ python myapp.py

部署

Sanic 项目还不是特别成熟,现在部署比较简陋。对Gunicorn的支持也不完善。

详细信息可以 看下这个问题 Projects built with sanic?

先在说下我的部署方式

使用 supervisord 部署

启动 方式

supervisord -c supervisor.conf

总结

试用了下Sanic,把之前的一个聊天机器人从Flask 改成了 Sanic。不得不说,如果你有Flask经验,大致看一下Sanic文档就可以直接上手了。

并且Sanic 的速度比Flask 快很多,只是Sanic配套的包还是太少,用于生产环境有一定的风险。

预告

下一篇将介绍如何使用 Sanic 一步一步创建一个 聊天机器人。

参考链接

最后,感谢女朋友支持。

>欢迎关注

>请我喝芬达

1460000009873993?w=430&h=430

1460000009873994?w=425&h=425

彩蛋

魔魔是我们家巴哥的名字

贴一张魔魔的照片结束本篇文章。

1460000009920160?w=1002&h=1342

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux tcp ip c,Linux下TCP/IP编程--TCP实战(select)

本文参考自徐晓鑫《后台开发》,记录之。一、为什么要使用非阻塞I/O之select初学socket的人可能不爱用select写程序,而习惯诸如connect、accept、recv/recvfrom这样的阻塞程序。当让服务器同时为多个客户端提供一问一答服务时,很多程序员采用多…

mybatis 取查询值_Mybatis --- 映射文件、参数处理、参数值的获取、select元素

这样就可以在insert函数中获取新添加的用户的 id主键,否则获取不到select * from student where id #{id}insert into student(name,password,email) values(#{name},#{password},#{email})编写测试单元:private EmployeeMapper mapper null;private S…

单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏

为了让大家更深入地了解底层的原理,在讲解时特意选择了51单片机(而非STM系列),另外16*16点阵由译码器和移位缓存器直接驱动(而非MAX系列芯片),摇杆也利用ADC功能判断方向。那如何让单片机驱动这256个点呢?直接用IO口驱动显然不够且…

怎样在linux中创建硬盘,在linux中添加新硬盘并创建LVM组

1、以虚拟机为例,给虚拟机添加一块新硬盘,并创建LVM组,将新硬盘用于存放oracle数据库文件。2、fdisk -ll查看新添加的硬盘是否被识别,如图已经识别出sdb。3、# pvcreate /dev/sdb (创建PV,相当于win中将基础磁盘转换…

python 输入框查询_Element输入框带历史查询记录

需求描述页面的查询框增加一下显示历史查找记录实现及踩坑记录使用Element带输入建议的输入框来实现此需求。用法详见官网1. 坑1:不能直接在querySearch里返回数组,一定要调用回调函数cb来处理数据看了一下例子,建议列表应该是个数组&#xf…

双代号网络图基础算法_软考网络工程师之系统开发和运行基础(软件分类、测试、模型)...

系统开发和运行基础(软件的分类、软件生存周期、软件开发模型、软件测试、软件项目管理)软件的分类系统软件,如操作系统。支撑软件,如开发工具。应用软件,如office。实时处理软件,一般是工业软件。软件生存周期1、软件定义问题定义…

linux怎么添加更新源,在Deepin 15.7系统中不需要在/etc/apt/sources.list添加更新源

Deepin 15.7和其他的Linux发行版在添加/etc/apt/sources.list更新源上明显不同,比如Ubuntu 18.04可以往该文件中添加国内的高速更新源,如Ubuntu 18.04更换国内高速源一文介绍的,而在Deepin 15.7系统中的/etc/apt/sources.list手动添加更新源后…

embedv.php_PHP与视频播放插件功能实现,非常简单

PHP与视频播放插件功能实现,非常简单龙行 PHP 2018-8-28 2579 0评论最近在研究maccms所以会接触到这个ckplayer播放器,那么如何php与视频播放器插件的功能,说白了就是前端是播放器的插件,直接调用后端传递过来的播放地…

python安卓版开发环境搭建_React Native Android 开发环境搭建(Windows 版)

补上之前说的 Windows 系统的 React Native 开发环境搭建,坑还是比 Mac 环境下的多些。此文的受众还是已经搭建过 Android 开发环境的同学。 需要安装的软件 Chocolatey Chocolatey是一个在 Windows 上比较受欢迎的包管理器,安装命令如下: 1 …

linux 的内核参数优化,Linux服务器内核参数优化

Linux服务器内核参数优化cat >> /etc/sysctl.conf << EOF#kernel optimizationnet.ipv4.tcp_fin_timeout 2net.ipv4.tcp_tw_reuse 1net.ipv4.tcp_tw_recycle 1net.ipv4.tcp_syncookies 1net.ipv4.tcp_keepalive_time 600net.ipv4.ip_local_port_range 4000 6…

aspen求理论塔板数_aspen 塔设计

果。方法&#xff1a;对第 5 步的计算结果(如&#xff1a;塔径等)按设计规范要求进行必要的圆整&#xff0c;用 RateFrace 或 RateFrace 模块的Tray Rating(填料塔用PAking Sizing)&#xff0c;对塔进行设计核算。结果&#xff1a;塔工艺设计的所有需要的结果。如果仅是完成设计…

在学Python前学Linux,Python原来这么好学-1.2节: 在Linux中安装python

这里将告诉您Python原来这么好学-1.2节: 在Linux中安装python,具体操作过程:在Linux系统的主要发行版中&#xff0c;按其软件包格式来进行划分&#xff0c;可分为Deb系以及RPM系操作系统。Linux系统与Windows系统有一个很重要的区别&#xff0c;Linux系统完全免费&#xff0c;开…

python关键字的意思_python 关键字(Keywords)

2018-04-30 python 关键字&#xff08;Keywords&#xff09; 声明&#xff1a;本文章大部分来自下面博客&#xff0c;对其作者表示感谢。以后会有详细的关键字说明。 1、and&#xff1a; 表示逻辑‘与’ 2、del&#xff1a; 用于list列表操作&#xff0c;删除一个或者连续几个元…

python modulenotfounderror_python 服务器运行代码报错ModuleNotFoundError的解决办法

一、问题描述一段 Python 代码在本地的 IDE 上运行正常&#xff0c;部署到服务器运行后&#xff0c;出现了 ModuleNotFoundError: No module named ‘xxx" 错误。二、问题原因在代码中引入了其他文件的包(自己写的包&#xff0c;非 pip 安装的)&#xff0c;问题出在 impor…

python金融大数据分析视频_Python金融大数据分析 PDF 全书超清版

给大家带来的一篇关于Python相关的电子书资源&#xff0c;介绍了关于Python金融、大数据分析方面的内容&#xff0c;本书是由人民邮电出版社出版&#xff0c;格式为PDF&#xff0c;资源大小47.8 MB&#xff0c;希尔皮斯科编写&#xff0c;目前豆瓣、亚马逊、当当、京东等电子书…

linux批量切割图片,MAC中用Shell脚本批量裁剪各种尺寸的App图标

在APP上架前&#xff0c;一次一次自己剪裁上架需要的各个尺寸的Icon不是程序员该干的事&#xff0c;使用Mac中自带的sips工具可以解决这个需求。关于sips&#xff0c;在终端中直接执行可以出现以下信息&#xff1a;sips 10.4.4 - scriptable image processing system.This tool…

刘卫国python实验答案_MATLAB(刘卫国)部分实验答案

实验3第一题&#xff1a;clear allm[-5.0,-3.0,1.0,2.0,2.5,3.0,5.0];for xmif x<0&x~-3y1x^2x-6;disp([y ,num2str(y1)])elseif x>0&x<5&x~2&x~3y2x^2-5*x6;disp([y ,num2str(y2)])elsey3x^2-x-1;disp([y ,num2str(y3)])endend第二题&#xff1a;cle…

kaggle房价预测特征意思_机器学习-kaggle泰坦尼克生存预测(一)-数据清洗与特征构建...

1、背景&#xff1a;1.1 关于kaggle&#xff1a;谷歌旗下的 Kaggle 是一个数据建模和数据分析竞赛平台。该平台是当下最流行的数据科研赛事平台&#xff0c;其组织的赛事受到全球数据科学爱好者追捧。 如果学生能够在该平台的一些比赛中获得较好的名次&#xff0c;不仅可以赢得…

linux docker安装svn,使用docker镜像搭建svn+Apache环境

环境准备虚拟机装好之后&#xff0c;按照官网步骤检查虚拟机内核版本&#xff0c;必须在3.10以上版本&#xff0c;故此处安装redhat_7.2# uname -r3.10.0-327.el7.x86_64安装docker&#xff1a;yum install docker-io有依赖是直接安装具体的依赖软件&#xff0c;解决依赖docker…

感恩工作平台心得体会_感恩工作心得体会6篇

2016全新精品资料-全新公文范文-全程指导写作–独家原创1/9感恩工作心得体会6篇感恩是世界最美好的语言&#xff0c;是心中最美的境界。感恩不但是一种美德&#xff0c;也是我们工作中必须要有的一种心态。下面是美文网带来的感恩工作的心得体会&#xff0c;仅供参考。感恩工作…