zoukankan      html  css  js  c++  java
  • sanic官方文档解析之路由

    1,路由,路由相当于一个网址的地址,来确定网址的位置和唯一性

    当http://server.url/被允许访问服务器,当最后的"/"通过路由匹配到了业务逻辑处理的函数,将会返回一个json对象

    Sanic处理函数必须被定义使用async def语法,作为异步处理的函数

    • 1.1请求参数的处理(Request  Parametres)

    Sanic框架天生自带一个基本的支持参数的路由

    为了特殊的参数,支持引用尖括号来携带参数类似:<PARAM>,请求参数将会被通过路由处理函数作为关键字参数

    • 1.2参数的特殊类型

    参数的特殊形式在后边增加一个,参数的数据类型(:type)在参数的后边,尖括号的里边,如果参数和数据类型不匹配,Sanic框架会抛出一个NotFound的例子,会在url上显示404: Page not found

    这个int和 number有什么区别,未完待续...?

    这个[A-z]和[A-z]+和[A-z0-9]{0,4}应该是和正则匹配的规则是一致的,未完待续...?

    • 1.3HTTP请求的方式

    通常,一个路由定义一个URL将会被可用的仅仅只能为get请求,然而,这个@app.route装饰器接收一组可供选择的参数,请求方法,在列表;写哪一个请求的方法,就会运行哪一个请求的方法.

    路由里还有一个可选的host参数(可以是列表或者是一个字符串),严格的提供host或者hosts,如果没有host,将是默认是host.

    也有一些快键的路由指定请求的方式,直接定义骑牛的方式,@app.get,@app.post.

    • 1.4增加路由的方法

     正如我们所见,路由京城被特殊的用作@app.route,装饰器,然而,这样的装饰器已经缺失装饰了app.add_route,被做作为一个追随者.,具体使用如上图

    • 1.5,用url_for建立url

    Sanic框架提供了一个url_for方法,是基于处理方法名称去生成url,如果你想避免在你的app中编码url的路径,你可以参考以上的处理名字.(对求的参数可以做判断筛选)内部跳转,不用客户端再发一次请求了,类似namespace

    一下这几种情况牢记要使用url_for

    • 通过url_for没有请求参数的关键字参数将会被包含在查询的url中
    • 多个值的参数将会通过url_for来设置路由

    • 还有一些特殊的参数(_anchor_external_scheme_method_server)通过url_for将会有特殊的url建立的方法(_method现在和你支持这样的操作并且将会忽略)
    • 所有有效的参数必须通过url_for去建立URL,如果没有供给一个参数,或者 参数和数据类型不搭配,将会抛出一个URLBuildError的错误
    • 1.6websocket通信路由

    Websocket协议的路由能够被@app.websocket装饰(直接在装饰器中,在视图函数中收发消息)

    app.add_websocket_route这个方法可以被用作路由的装饰器

     用请求的第一个参数处理Websocket路由被调用,并且W二本socket协议对象作为第二个参数,这个Websocket协议对象能够分别的接受和发送数据

    • 1.7关于路由斜线的说明
    from sanic import Sanic, Blueprint
    from sanic.response import text
    
    # 实例化一个Sanic对象
    # 为所有的提供路由提供斜线的配置
    app = Sanic("test_route_strict_slash", strict_slashes=True)
    # 你可以为特殊的路由设置斜线
    
    
    @app.get("/get", strict_slashes=False)
    def handler(request):
        return text("ok")
    
    # 也可以为蓝图设置斜线的配置
    bq = Blueprint("test_bq_strict_slash", strict_slashes=True)
    
    @bq.get("/bq/get", strict_slashes=False)
    def handler(request):
        return text("ok")
    
    app.blueprint(bq)
    • 使用定义的路由的名字

    通过有一个name的参数被用来习惯性的设置成路由的名字,与此同时注册侧路由用handler.__name__的属性重写默认的路由的名字

    from sanic import Sanic, Blueprint
    from sanic.response import text
    
    
    # 实例化一个Sanic对象
    app = Sanic("test_named_route")
    
    
    @app.get("/get", name="get_handler")  # 给这个路由重命名
    def handler(request):
        return text("ok")
    
    # 你需要使用app.url_for("get_handler")来反向解析这个路由
    # 代替app.url_for("handler")
    
    
    # 同样也为蓝图工作
    bq = Blueprint("test_named_bq")
    
    
    @bq.get("/bq/get", name="get_handler")
    def handler(request):
        return text("ok")
    
    
    app.blueprint(bq)
    
    
    # 你需要使用app.url_for("test_named_bq.get_handler)
    # 代替app.url_for("handler)
    # 不同的名称和不同的方法都能够被用于同一个url中
    
    @app.get("/test", name="route_test")
    def handler(request):
        return text("ok")
    
    
    @app.post("/test", name="route_test")
    def handler2(request):
        return text("ok POST")
    
    @app.put("/test", name="route_put")
    def handler3(request):
        return text("ok put")
    
    
    # 在url相同的情况下,你可以使用以上三只中方法中的任何一个
    app.url_for("route_test")
    
    
    # 用不同的方法处理在路由重命名一样
    # 你需要一个特殊的命名
    @app.get("/get")
    def handler(request):
        return text("ok")
    
    
    @app.post("/post", name="post_handler")
    def handler(request):
        return text("ok")
    • 1.8为静态文件设置url

    Sanic支持使用url_for的方法去建立静态文件的url,如果万一静态的文件指向了一个字典,这个url_for会忽略文件的参数

  • 相关阅读:
    python基础(9):基本数据类型四(set集合)、基础数据类型补充、深浅拷贝
    python基础(8):基本数据类型三(dict)、is和==、编码和解码
    python基础(7):基本数据类型二(list、tuple)、range
    python基础(1):python介绍、python发展史
    python基础(6):基本数据类型一(int、bool、str)
    python基础(5):格式化输出、基本运算符、编码问题
    python基础(4):用户交互、if判断、while循环、break和continue
    python基础(2):python的安装、第一个python程序
    python基础(3):变量、常量、注释、基本数据类型
    java基础(32):类加载、反射
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/10391799.html
Copyright © 2011-2022 走看看