自定义 Sanic Exception

Sanic 是一个和类Flask 的基于Python3.5+的web框架,它使用了 Python3 异步特性,有远超 flask 的性能。 编写 RESTful API 的时候,我们会定义特定的异常错误类型,比如我定义的错误返回值格式为: { "error_code": 0, "message": "string", "text": "string" } 不同的错误信息指定不同的 http 状态码。 sanic 提供了几种常用的 exception: NotFound(404) Forbidden(403) ServerError(500) InvalidUsage(400) Unauthorized(401) RequestTimeout(408) PayloadTooLarge(413) 这些 exception 继承自 SanicException 类: class SanicException(Exception): def __init__(self, message, status_code=None): super().__init__(message) if status_code is not None: self.status_code = status_code 从上述代码可以看出,这些异常只能指定 message 和 status_code 参数,那我们可不可以自定义 exception 然后在自定义的 exception 中增加参数呢?下面的代码是按照这个思路修改后的代码: class ApiException(SanicException): def __init__(self, code, message=None, text=None, status_code=None): super().__init__(message) self.error_code = code self.message = message self.text = text if status_code is not None: self.status_code = status_code 使用后我得到一个结果如下: ...

2017-08-05 · 2 min · 395 words

python web 框架 Sanci 快速入门

简介 Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快。 除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求。这意味着你可以使用新的 async/await 语法,编写非阻塞的快速的代码。 关于 asyncio 包的介绍,请参考之前的一篇文章 python并发2:使用asyncio处理并发 Github 地址 是 https://github.com/channelcat/sanic,感兴趣的可以去贡献代码。 既然它说速度特别快,我们先看下官方提供的 基准测试结果。 Sanic基准测试 这个测试的程序运行在 AWS 实例上,系统是Ubuntu,只使用了一个进程。 Sanic 的开发者说他们的灵感来自于这篇文章 uvloop: Blazing fast Python networking。 那我们就有必要看下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实例。 ...

2017-06-25 · 4 min · 730 words