sanic官方文档解析之Exception和Middleware,Listeners
1,异常

异常是从处理请求内部抛出来的,并且通过Sanic自动的被处理异常,,异常用第一个参数携带异常信息,还可以接受在HTTP响应中要传递回的状态代码。引发异常
- 1.1引发异常

自动触发异常,,简单的额使用raise从sanic.exceptions的模块中抛出相关的异常即可

你也可以使用中止函数的状态码,来抛异常 ,如上图所示:
- 1.2异常处理

@app.exception被使用来重写处理默认的异常,,这个装饰器期望一系列的异常作为参数去处理,你可以通过SanicException去抓住异常,装饰异常处理函数必须携带请求和异常对象在参数中.

你也可以增加异常处理.

有些情况下,,你也许想添加一些更详细的错误信息处理函数,可以默认提供,在那种情况下,你可以对Sanic的错误语法进行子类的划分.
- 1.3有用的例外

一些有用的例外,目前如上所示:
- NotFound:当找不到适合请求的路由时调用
- ServerError:当服务器发生故障时调用。如果用户代码中出现异常,通常会发生这种情况
- 有关引发异常 的完整列表,请参考sanic.exception模块.
2, 中间件:

中间件是用在请求到来之前和响应请求之后,,中间件可以被用来修改 氢气去和 响应,在中间件处理函数中
另外,Sanic提供监听运行的代码的多种要点在你懂得的应用中

Sanic中有2中类型的中间件,请求和响应,者两种响应都用@app.middleware装饰器来装饰.用装饰器的参数是字符串来代替request或者是response.
from sanic import Sanic
from sanic.response import text # 实例化Sanic对象
app = Sanic(__name__) @app.middleware("request")
async def print_on_request(request):
print("i print when a request is received by the server") @app.middleware("response")
async def print_on_response(request ,response):
print("i print when a response is returned by the server")
- 2.1修改请求和响应

中间件能够修改给定的请求和响应的参数,只要中间件没有返回请求或者响应
from sanic import Sanic # 实例化Sanic对象
app = Sanic(__name__) @app.middleware("request")
async def add_key(request):
# 增加请求对象的关键字,就像地点的对象
request["foo"] = "bar" @app.middleware("response")
async def custom_banner(request, response):
response.headers["Server"] = "Fake-Server" @app.middleware("response")
async def prevent_xss(request, response):
response.headers["x-xss-protection"] = "1; mode-block" app.run(host="0.0.0.0", port=8000, debug=True)

以上代码应用在中间件中,第一个中间件增加一个新的关键字foo到请求request中,中间件的运行是因为请求对象的主体类似字典对象,第二个中间件定制的横幅将会改变HTTP响应头为Fake-Server,最后一个中间件是为了增加HTTP头防止xss攻击,这些2个功能在函数返回一个 response响应的时候调用
- 2.2早期的回应

如果中间件返回一个httpresponse对象,那么请求将停止处理并返回响应。如果在到达相关的用户路由处理程序之前请求出现这种情况,则永远不会调用该处理程序。返回响应还将阻止任何其他中间件的运行
from sanic import Sanic
from sanic.response import text # 实例化一个Sanic对象
app = Sanic(__name__) @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")
3,监听

如你想执行启动/拆卸的代码作为你服务器的启动或者关闭,你可以使用以下几种监听模式:
- before_server_start
- after_server_start
- before_server_stop
- after_server_stop
这些监听的方式被作为装饰在接收app项目也异步循环的功能函数的装饰器
from sanic import Sanic # 实例化一个Sanic对象
app = Sanic(__name__) @app.listener("before_server_start")
async def setup_db(app, loop):
app.db = await db_setupb() @app.listener("after_server_start")
async def notify_server_started(app, loop):
print("Server successfully started!") @app.listener("before_server_stop")
async def notify_server_stopping(app, loop):
print("Server shutting down!") @app.listener("after_server_stop")
async def close_db(app, loop):
await app.db.close()

监听同样也可以用register_listener方法来注册一个监听者,如果你定义你的监听者在另一个模块中,此外在你实例化你的app中.
from sanic import Sanic # 实例化一个Sanic对象
app = Sanic() async def setup_db(app, loop):
app.db = await db_setup() app.register_listener(setup_db, "before_server_start") # 注册监听者(在服务启动前)

如果要计划在循环启动后运行后台任务,Sanic提供了add_task方法很容易启动后台程序.
from sanic import Sanic
import asyncio # 实例化Sanic对象
app = Sanic() async def notify_server_started_after_five_second():
await asyncio.sleep(5)
print("Server successfully started!")
# 用app来增加异步功能函数的任务
app.add_task(notify_server_started_after_five_second())

Sanic将会尝试去自动的 诸如到app中,作为一个参数添加到任务中.
import asyncio
from sanic import Sanic # 实例化一个Sanic对象
app = Sanic()
async def notify_server_started_after_five_second(app):
await asyncio.sleep(5)
print(app.name)
# 用app来增加异步函数功能
app.add_task(notify_server_started_after_five_second)

或者你可以明确地作用于app,也是一样的效果.
from sanic import Sanic
import asyncio # 实例化一个Sanic对象
app = Sanic() async def notify_server_started_after_five_seconds(app):
await asyncio.sleep(5)
print(app.name)
app.add_task(notify_server_started_after_five_seconds(app))
sanic官方文档解析之Exception和Middleware,Listeners的更多相关文章
- sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)
1,Custom Protocol:自定义协议 温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能 通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio ...
- sanic官方文档解析之Example(二)
1,通过docker部署sanic项目 通过Docker和Docker Compose部署SANIC应用程序是一项很容易实现的任务,下面的示例提供了示例simple_server.py的部署 FROM ...
- sanic官方文档解析之Deploying(部署)和Extension(扩展)
1,Deploying(部署) 通过内置的websocket可以很简单的部署sanic项目,之后通过实例sanic.Sanic,我们可以运行run这个方法通过接下来的关键字参数 host (defau ...
- sanic官方文档解析之Example(一)
1,示例 这部的文档是简单的示例集合,它能够帮助你快速的启动应用大部分的应用,这些应用大多事分类的,并且提供给ini工作的连接代码: 1.1,基础示例 这部分示例集成了提供简单sanic简单的代码 单 ...
- sanic官方文档解析之路由
1,路由,路由相当于一个网址的地址,来确定网址的位置和唯一性 当http://server.url/被允许访问服务器,当最后的"/"通过路由匹配到了业务逻辑处理的函数,将会返回一个 ...
- sanic官方文档解析之logging和request Data
1,sanic的logging: Sanic允许有做不同类型的日志(通过的日志,错误的日志),在基于Python3的日志API接口请求,你必须具备基本的Python3的日志知识,在你如果想创建一个新的 ...
- sanic官方文档解析之下载和Configuration
1,sanic框架是做什么的? sanic的官方网址:https://sanic.readthedocs.io/en/latest/ sanic框架是一个类似于flask框架的在Python3.5以上 ...
- sanic官方文档解析之ssl,debug mode模式和test(测试)
1,ssl 示例: 可选择的SSLContent from sanic import Sanic import ssl context = ssl.create_default_context(pur ...
- sanic官方文档解析之streaming(流动,滚动)和class_based_views(CBV的写法)
1,streaming(流媒体) 1.1请求流媒体 Sanic允许你通过流媒体携带请求数据,如下,当请求结束await request.stream.read()就会返回None,仅仅只有post请求 ...
随机推荐
- Codeforces Round #415 (Div. 2) 翻车啦
A. Straight «A» time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 【Luogu】P3865ST表模板(ST表)
题目链接 本来准备自己yy一个倍增来着,然而一看要求O1查询就怂了. ST表模板.放上代码. #include<cstdio> #include<cstdlib> #inclu ...
- 【Luogu】P1593因子和(唯一分解定理,约数和公式)
题目链接 首先介绍两个定理. 整数唯一分解定理:任意正整数都有且只有一种方式写出素数因子的乘积表达式. \(A=(p1k1 p2k2 ...... pnkn \) 求这些因子的代码如下 ;i*i< ...
- [luoguP3172] [CQOI2015]选数(递推+容斥原理)
传送门 不会莫比乌斯反演,不会递推. 但是我会看题解. 先将区间[L,H]变成(L-1,H],这样方便处理 然后求这个区间内gcd为k的方案数 就是求区间((L-1)/k,H/k]中gcd为1的方案数 ...
- P1026 统计单词个数 (动态规划)
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- UVa10234 Race
递推,设有i个人排在第一名,剩下的人排在后面,方案有f[i]种,则f[i]=sum(c[n][i]*f[n-i]) 1<=i<=n /*by SilverN*/ #include<a ...
- 【BZOJ2049】洞穴勘测(LCT)
题意:一张图,要求支持以下操作: 1.加边 2.删边 3.询问两点之间是否联通 100%的数据满足n≤10000, m≤200000 思路:LCT裸题,不需要维护任何信息 ..,..]of longi ...
- Tomcat 7 的domain域名配置,Tomcat 修改JSESSIONID
https://blog.csdn.net/catoop/article/details/64581325
- [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt
[TJOI2019]唱.跳.rap和篮球 这么多人过没人写题解啊 那我就随便说说了嗷 这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往 ...
- 【面试 springMVC】【第四篇】springMVC的一些问题
1.springMVC的工作流程是什么样的 1.用户请求到达 2.DispatcherServlet接收请求,发送给处理器映射器 3.处理器映射器handlerMapping,处理找到对应处理器,返回 ...