zoukankan      html  css  js  c++  java
  • 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))
  • 相关阅读:
    【openCV学习笔记】【2】读取并播放一段视频
    Net WebApi中使用Swagger
    .pfx格式和.Cer格式的区别
    数字证书原理
    ASP.NET发送电子邮件
    WindowsAzure上把WebApp和WebService同时部署在一个WebRole中
    JS原型与原型链终极详解
    三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
    二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
    一、ASP.NET Routing路由(深入解析路由系统架构原理)
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/10391809.html
Copyright © 2011-2022 走看看