1,异常服务器
异常是从处理请求内部抛出来的,而且经过Sanic自动的被处理异常,,异经常使用第一个参数携带异常信息,还能够接受在HTTP响应中要传递回的状态代码。引起异常app
自动触发异常,,简单的额使用raise从sanic.exceptions的模块中抛出相关的异常便可异步
你也可使用停止函数的状态码,来抛异常 ,如上图所示:xss
@app.exception被使用来重写处理默认的异常,,这个装饰器指望一系列的异常做为参数去处理,你能够经过SanicException去抓住异常,装饰异常处理函数必须携带请求和异常对象在参数中.async
你也能够增长异常处理.函数
有些状况下,,你也许想添加一些更详细的错误信息处理函数,能够默认提供,在那种状况下,你能够对Sanic的错误语法进行子类的划分. oop
一些有用的例外,目前如上所示:spa
2, 中间件:debug
中间件是用在请求到来以前和响应请求以后,,中间件能够被用来修改 氢气去和 响应,在中间件处理函数中3d
另外,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")
中间件可以修改给定的请求和响应的参数,只要中间件没有返回请求或者响应
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响应的时候调用
若是中间件返回一个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,监听
如你想执行启动/拆卸的代码做为你服务器的启动或者关闭,你可使用如下几种监听模式:
这些监听的方式被做为装饰在接收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))