python-web框架flask:引入蓝图和遇到的问题

参考:flask官网

1、什么是蓝图

       当我们的程序只有一个文件的时候(比较小的时候),我们可以直接在这个文件中进行启动,没有问题,但是当我们的程序变得很大的时候,我们需要进行分级,也可以说是分模块,那么对于每个模块来说,怎么去访问到他的路径呢,这里就要用到我们的蓝图了。蓝图可以看做是全局和局部模块沟通的一个工具,看一下官网的解释:

蓝图方式是把它们注册到蓝图,然后在工厂函数中 把蓝图注册到应用。

2、蓝图配置

       话说什么是蓝图,其实官网给出了解释,比如这篇文章:蓝图与视图,其实一开始在网上找各种资料的时候,我是懵逼的,后面自己做了一下实验发现说原来他这个东西道理其实很简答,无非就是局部声明,全局注册。

       按照官网的说法,应该是在你的某个模块(这边的模块指的是一个py文件)声明一个视图,然后在这个模块对应的**—init**方法中进行注册。
我们来看一下下图解释:
在这里插入图片描述
       正常情况下是直接在 init 类里面进行注册,我这边是直接放到路由里面进行注册,注册只是一种方式,主要是看如何管理这个东西,在路由里面注册相对更集中,而在 init 类里面进行注册相对更加清晰。

       当然还有一种方式就是直接在模块的py文件当中进行注册,这当然是一种可行的方法,但是需要注意的就是循环引用的问题,举个例子就是说,可能你在当前模块中引入了路由中的app对象,然后又需要在路由当中引入当前模块的蓝图对象,这样就会有问题,或者说是多级的循环引用,这种方式感觉不是很推荐
在这里插入图片描述
       当然还有一种更集中化的注册方式就是在在 init 类中声明和注册,然后,在模块对应的文件中引入该声明的蓝图对象,这种方式应该说就是实现比如说你一个模块的文件很多的时候,我只需要声明和注册一个蓝图就行了。
在这里插入图片描述

我们来看一下,我这边的实现方式和注意的地方,上代码:
在这里插入图片描述
需要注意的几个地方就是:

  • 在模块中要使用当前声明的蓝图标签进行路径的引用,不然可能造成循环引用问题。
  • 蓝图声明之后需要注册才能生效。

3、遇到问题

1、循环引用问题 ImportError

       这个问题在我上面一个文章也有说明,其实还是比较恶心的,层次结构会有所引用,这边采取在函数中import的方式来解决,最好的方式当然是层次划分的足够清楚。此间不多赘述。
在这里插入图片描述

2、重名问题 AssertError

       一个蓝图对应一个名字,这个就跟java的map一个道理,一个key只能对应一个value,这边其实处理和spring启动的处理有点类似,当你重名的时候没办法区分,直接报错,所以当我们引入蓝图的时候,一定要注意的就是重名问题。
在这里插入图片描述

3、html请求路径问题 werkzeug.routing.BuildError

       图片中的最后一个错误信息其实已经说明了问题,可能很多人会错误的把错误以为成,是我们在定义入参的错误,其实不是,这边是html路径问题,tmd这个错误报的也是奇葩啊。
在这里插入图片描述

看一下怎么解决:
       我们在log这个文件中定义了一个蓝图叫做api,然后我们会进入一个render模板,在这个模板里面还会请求api这个蓝图对应的路径,我们原先这个url_for是没有加上api.的,所以会报错,因为他识别不出来到底是哪个接口(因为我们引入了蓝图)
在这里插入图片描述

发布了117 篇原创文章 · 获赞 15 · 访问量 5607

猜你喜欢

转载自blog.csdn.net/qq_34326321/article/details/104996055