本文实例讲述了Sanic框架路由用法。分享给大家供大家参考,具体如下:

前面一篇《Sanic框架安装与简单入门》简单介绍了Sanic框架的安装与基本用法,这里进一步学习Sanic框架的路由。

简介

Sanic是一个类似Flask的Python 3.5+ Web服务器,它的写入速度非常快。除了Flask之外,Sanic还支持异步请求处理程序。这意味着你可以使用Python 3.5中新的闪亮的异步/等待语法,使你的代码非阻塞和快速。

前言:Sanic最低支持Python 3.5,如果需要学习Sanic,请先下载版本不低于3.5的Python包

路由

路由允许用户为不同的URL端点指定不同的处理函数,我们取出上一篇《Sanic框架安装与简单入门》的路由为例:

from sanic.response import json

@app.route("/")

async def hello_sanic(request):

data = json({"code":0})

return data

当我们在浏览器输入http://localhost:5000/时,根据路由匹配到处理函数hello_sanic,最终返回JSON对象。Sanic处理函数必须使用语法async def来定义,因为它们是异步行数。

请求参数

Sanic处理函数带有一个支持请求的参数,即上面的request参数。如果需要制定一个参数,我们可以使用尖角括号将其括起来,如下所示:

from sanic.response import json

@app.route("/hello/")

async def hello(request,name):

return json({"name":name})

此时我们再浏览器输入:http://localhost:5000/hello/laowang时,Sanic将会根据路由匹配处理函数,从而返回数据。此时,我们需要对参数进行指定类型,可以在路由中的参数后面加上:type,假设传入一个age参数,为int类型,路由可以这么写:/hello/。代码如下:

from sanic.response import json

@app.route("/hello/")

async def hello_age(request,age):

return json({"age":age})

此时就可以指定用户传入指定类型的参数了,如果类型不对,将报404错误。

请求类型

对于Sanic处理网络请求,也举了不少例子,可是这些都是GET请求,那我们该如何定义一个POST请求呢?与Flask相同,@app.route支持一个可选参数methods,methods可传入一个列表类型,如此,它将允许处理函数使用列表中的任何HTTP方法。

from sanic.response import json

@app.route("/post/json_data",methods=["POST"])

async def post_json(request):

"""

POST请求 json数据

"""

return json(request.json)

@app.route("/post/form_data",methods=["POST"])

async def post_form(request):

"""

POST请求 form表单数据

"""

return json(request.form)

@app.route("/get/data",methods=["GET"])

async def get_data(request):

"""

GET请求

"""

return json(request.args)

因为GET请求时默认的,所以,如果需要定义一个GET请求,那么methods参数可以无需传递。@app.route还支持另一个可选参数host,这限制了一条到所提供的主机或主机的路由。

from sanic.response import text

@app.route("/hello/host",host="abc.com")

async def hello_host(request):

return text("hello host")

在浏览器中访问此路由,如果主机头不匹配abc.com,那么将会报404错误。

路由的装饰器写法除了上面介绍的那种,还可以将其简写,如下所示:

from sanic.response import json

@app.get("/short/get")

async def short_get(request):

return json(request.args)

@app.post("/short/post")

async def short_post(request):

return json(request.json)

add_route方法

通常我们指定一个路由,都是通过@app.route装饰器,然而,这个装饰器实际上只是这个add_route方法的一个包装器,使用方法如下:

async def add_get_route(request):

"""

添加GET请求

"""

return json(request.args)

async def add_get_type_route(request,age):

"""

添加带指定类型的参数的GET请求

"""

return json({"age":age})

async def add_post_route(request):

"""

添加POST请求

"""

return json(request.json)

app.add_route(add_get_route,"/add_get_route")

app.add_route(add_get_type_route,"/add_get_type_route/")

app.add_route(add_post_route,"/add_post_route",methods=["POST"])

重定向

Sanic提供了一个url_for基于处理程序方法名称生成URL的方法。如果你想要避免将URL路径硬编码到你的应用程序当中,这很有用。例如:

from sanic.response import text,redirect

@app.route("/url_info")

async def url_info(request):

url = app.url_for('post_handler',name="laozhang",arg_one="one",arg_two="two")

print(url)

return redirect(url)

@app.route("/post_handler/")

async def post_handler(request,name):

print(request.args)

return text("name:{}".format(name))

url_for使用注意:第一个参数为重定向URL的路由名称(默认为函数名称),并非URL名称。另外我们可以将一些请求参数指派到url_for方法中,上面例子重定向后的url将会是:

/post_handler/laozhang?arg_one=one&arg_two=two

也可以传递多值参数:

app.url_for("post_handler",favorite=["football","bastketball"])

# /post_handler?favorite=football&favorite=bastketball

唯一URL

在Flask中,我们顶一个一个URL为/get,此时我们访问/get将可以访问成功,如果输入/get/将会返回404错误,这就是唯一URL。在Sanic中同样拥有此功能,我们可以通过配置strict_slashes参数来实现:

from sanic.response import text

@app.route("/get",strict_slashes=True)

async def get(request):

return text("it is ok!")

注意:strict_slashes默认值为None,如果不设置的话,访问/get或/get/都将可以访问成功,那么这就不是唯一URL了。在上面的例子中,我们将此值设置为True,此时我们输入/get/,将会返回一个404错误,这样就完成了一个唯一URL的实现。

如果我们需要将所有的URL都设置成为唯一URL,我们可以这样:

from sanic import Sanic

from sanic.response import text

app = Sanic(strict_slashes=True)

@app.route("/hello")

async def hello(request):

return text("it is ok!")

@app.route("/world")

async def world(request):

return text("it is ok!")

/hello和world都变成了唯一URL。

如果我们只需要部分URL设置成唯一URL,我们可以在@app.route装饰器中传入strict_slashes,并设置为Flase,那么此URL将不是唯一URL。或者我们也可以定义一个蓝图,如下:

from sanic import Blueprint

ss_bp = Blueprint("aaa",strict_slashes=False)

@ss_bp.route("/world")

async def world(request):

return text("it is ok!")

app.blueprint(ss_bp)

即使你在app中传递了参数strict_slashes=True,那么也没有用,所有通过此蓝图定义的URL都将不是唯一URL。

自定义路由名称

通常一个路由的名称为程序处理方法名称,即函数.__name__生成的,用于可以传递一个name参数到装饰器中来修改它的名称,如下:

from sanic.response import text

@app.route("/get",name="get_info")

async def get(request):

return text("it is ok!")

此时url_for中传递的将不是函数名称,而是name的值:

print(app.url_for("get_info")) # /get

同样,也适用于蓝图:

from sanic import Blueprint

ss_bp = Blueprint("test_bp")

@ss_bp.route("/get",name="get_info")

async def get(request):

return text("it is ok!")

app.blueprint(ss_bp)

print(app.url_for("test_bp.get_info"))

静态文件的URL

我们需要构建一个特定的URL来访问我们需要的HTML,此时我们可以这样:

from sanic import Sanic,Blueprint

app = Sanic()

app.static("/home","./static/home.html")

此时我们在访问/home就可以链接到我们指定的HTML中了,此方法同样适用于蓝图。

CompositionView

除了上面那几种定义路由的方法之外,Sanic还提供了CompositionView来动态添加路由:

from sanic.views import CompositionView

from sanic.response import text

async def post_handler(request):

print(request.json)

return text('it is ok!')

view = CompositionView()

view.add(["POST"],post_handler)

app.add_route(view,"/post_info")

如此,就构造了一个POST请求的接口

处理器装饰器

由于Sanic处理程序是简单的Python函数,因此可以用与Flask类似的修饰符应用于它们。一个典型的用例就是当一些代码想要在处理程序的代码执行之前执行:

from sanic.response import text

def is_authorized():

return True

def authorized(func):

async def wrapper(request,*args,**kwargs):

is_auth = is_authorized()

if is_auth:

response = await func(request,*args,**kwargs)

return response

else:

return text("it is not authorized")

return wrapper

@app.route("/get_user_info")

@authorized

async def get_user_info(request):

return text("get_user_info")

希望本文所述对大家Python程序设计有所帮助。

python框架sanic_Sanic框架路由用法实例分析相关推荐

  1. Android 8.1 Audio框架(二)AudioPolicy路由策略实例分析

    概述 这里以蓝牙耳机连接手机这一场景为例分析Audio路由策略是如何进行设备切换和管理输出的.蓝牙耳机连接上Android系统后,AudioService的handleDeviceConnection ...

  2. python asyncio回调函数_python回调函数用法实例分析

    python回调函数用法实例分析 本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步 ...

  3. python中max函数用法_Python中max函数用法实例分析

    Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...

  4. python中event的用法_Python编程之event对象的用法实例分析

    本文实例讲述了Python编程中event对象的用法.分享给大家供大家参考,具体如下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号 ...

  5. python中property函数_python 邮件表格Python中property函数用法实例分析

    本文实例讲述了Python中property函数用法.分享给大家供大家参考,具体如下: 通常我们在访问和赋值属性的时候,都是在直接和类(实例的)的__dict__打交道,或者跟数据描述符等在打交道.但 ...

  6. vue动态获取css样式,Vue 框架之动态绑定 css 样式实例分析

    今天的小实例是关于 Vue 框架动态绑定 css 样式,这也是非常常用的一个部分 首先说一下 动态绑定,相对的大家都知道静态绑定,静态绑定的话,直接加 class=""就可以了,使 ...

  7. php?redis的scan用法实例分析

    更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpyjn.c ...

  8. php 类常量用法,php类常量用法实例分析

    这篇文章主要介绍了php类常量用法,实例分析了php中类常量的概念.特性与相关使用技巧,需要的朋友可以参考下 本文实例讲述了php类常量用法.分享给大家供大家参考.具体如下: '; echo Foo: ...

  9. PHP - 回调函数概念与用法实例分析 - 学习/实践

    1.应用场景 主要用于理解回调函数的概念, 对比JavaScript中的回调函数, 更加深刻理解回调函数的本质, 以及如何高效使用~~~ 2.学习/操作 1. 文档阅读 https://www.jb5 ...

最新文章

  1. mysql client pip_mac pip install mysqlclient 报错
  2. 2016 CVPR 德州仪器 ADAS Tutorial
  3. Linux系统下命令行连接蓝牙设备
  4. 边记边学PHP-(十五)MySQL数据库基础操作2
  5. Android开发之代码开发部分字符串变色
  6. Python使用扩展库numpy计算矩阵加权平均值
  7. 机器学习《西瓜书》EM算法公式推导+三硬币模型求解实例
  8. 盘点无人机的关键技术点
  9. *推荐* 杏雨梨云U盘系统2011 全面加速 [2010.12.28]
  10. 【渝粤教育】电大中专电商运营实操 (17)作业 题库
  11. java 用户行为记录_大型网站用户行为记录的一个实现
  12. 进销存excel_EXCEL也能连接扫码枪?商品扫码入库,免费进销存自由修改功能
  13. 这个牛逼哄哄的数据库开源了
  14. 直流电源线缆 高速电缆 分类
  15. 使用mosquitto开发MQTT客户端
  16. 三星打印机ML-2165W实现wifi连接打印
  17. map容器/multimap容器
  18. easyX安装过程(详细)
  19. CoAP协议学习笔记(一)
  20. matlab印刷汉字识别,如何用MATLAB仿真印刷体汉字识别系统?

热门文章

  1. 50个最佳机器学习公共数据集(附链接)
  2. 王者荣耀服务器能不能注销,《王者荣耀》注销账号怎么回事?《王者荣耀》注销账号后能复原吗...
  3. 怎么剪辑视频教程,剪辑视频的软件怎么剪辑视频制作原创视频
  4. 拼多多店铺商品描述中哪些词不能出现?
  5. Ubuntu 18.04.1 下安装搜狗输入法
  6. 安卓手机反应越来越慢怎么办_安卓手机越用越卡怎么办,看完你学会了么
  7. 【Web】浏览器缓存(HTTP缓存)
  8. 计算机中的标准用户不见了,Win7系统计算机管理本地用户和组不见了怎么找回...
  9. 写给我即将毕业的研究生
  10. 数据库备份 Mysql table '' doesn t exist