一起学习Python的Sanic框架:路由和蓝图

举报
宇宙之一粟 发表于 2022/04/24 11:52:53 2022/04/24
【摘要】 引言Sanic 支持路由装饰器将处理函数映射到 HTTP 请求。我们可以在“路由”装饰器中使用名为 methods 的可选参数来处理列表中的任何 HTTP 方法。蓝图是一个概念,用于将子路由从大型应用程序的子模块插入 Sanic 应用程序。蓝图必须注册到 Sanic 应用程序对象中。使用蓝图还可以避免在整个应用程序中传递 Sanic 应用程序对象。一般来说,蓝图包括 MVC 框架中的 vie...

引言


Sanic 支持路由装饰器将处理函数映射到 HTTP 请求。我们可以在“路由”装饰器中使用名为 methods 的可选参数来处理列表中的任何 HTTP 方法。蓝图是一个概念,用于将子路由从大型应用程序的子模块插入 Sanic 应用程序。蓝图必须注册到 Sanic 应用程序对象中。使用蓝图还可以避免在整个应用程序中传递 Sanic 应用程序对象。

一般来说,蓝图包括 MVC 框架中的 view.pymodel.py。但为什么叫蓝图呢?每个子目录将包含远远超过一个蓝图对象。关键是要强化这样一个概念,即这个目录中的所有东西都是围绕这些离散的组件之一来解决的。


蓝图定义

根据官方文档,我们可以知道:


蓝图是应用中可以作为子路由的对象。蓝图定义了同样的添加路由的方式,您可以将一系列路由注册到蓝图上而不是直接注册到应用上,然后再以可插拔的方式将蓝图注册到到应用程序。


创建蓝图

在下面的程序中,我们能够将这些路由组合到一个单一的蓝图中。重要的是,这使我们能够将URL路径(/my_bp)的共同部分拉到蓝图中,这使我们能够灵活地在未来做出改变。


无论你决定如何组织你的文件结构,你可能总是应该使用蓝图。它们使组织更容易,甚至可以嵌套。就个人而言,我只在最琐碎的网络应用中使用 @app.route。对于任何真正的项目,我总是将路由附加到蓝图中。

from sanic import response
from sanic import Blueprint

my_bp = Blueprint("my_blueprint")

@my_bp.route('/my_bp')
async def my_bp_func(request):
    return response.text("My First Blueprint")

注册蓝图

仅仅创建我们的蓝图是不够的。Python 没有办法知道它们的存在。我们需要导入我们的蓝图并将它们附加到我们的应用程序中。这可以通过一个简单的注册方法完成:app.blueprint()


from controller import my_bp

app = Sanic(__name__)
app.blueprint(my_bp)



整体演示

为了演示路由和蓝图的使用,新建一个 main.py 文件:


from sanic import Sanic
from sanic import response
from sanic.log import logger
from controller import my_bp

app = Sanic("main")

app.blueprint(my_bp)

@app.route('/')
def run(request):
    return response.text("Hello World!")
@app.route('/post', methods=['POST'])
def on_post(request):
    try:
        return response.json({
            "host": request.host,
            "content": request.json,
            })
    except Exception as ex:
        import traceback
        logger.error(f"{traceback.format_exc()}")

app.run(host='127.0.0.1', port=8080, debug=True)


然后新建一个 controller.py :

from sanic import response
from sanic import Blueprint
my_bp = Blueprint("my_blueprint")

@my_bp.route('/my_bp')
async def my_bp_func(request):
    return response.text("My First Blueprint")


让我们运行 main.py ,访问 http://127.0.0.1:8080,能看到如下结果:


并在访问 http://127.0.0.1:8080/my_bp,能看到我们的蓝图结果显示 :



我们可以使用 Postman 客户端来展示我们的 POST 请求:


回到服务器也能看到如下的后台信息:


总结

最先在 Flask 框架中了解到蓝图的概念,但是在Sanic中,组织所谓组件的标准方法也是蓝图。因此,每个子目录将有一个而且只有一个蓝图对象。本文简单介绍了蓝图的定义,然后通过创建和注册蓝图,做了一个简单的演示,但这对于蓝图的理解远远不够。

因为蓝图对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。根据官方文档,蓝图对于大型应用特别有用。在大型应用中,您可以将应用代码根据不同的业务分解成多个蓝图。


参考链接:https://sanic.dev/zh/guide/best-practices/blueprints.html#%E6%A6%82%E8%BF%B0-overview

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。