由于项目中代码比较多了,在P18的时候我们新建一个项目,创建后是这个样子的
目录
1 蓝图 Blueprint
flask中的蓝图是多个路由与视图集成的产物,相当于django中的子应用,创建蓝图的目的是方便复用与维护
蓝图可以有自己的模板,静态文件,但是蓝图并不是一个完整的应用,不能独立运行
1.1 与应用对象在同一文件的蓝图
与应用对象在同一文件的蓝图是这样做的,首先创建一个蓝图对象,然后在蓝图中写路由和视图,最后把蓝图放到应用对象中
这里面蓝图的名称user是给开发者看的,和路由没有关系,创建的路由必须是之前没有的,当前代码我们还是访问127.0.0.1:5000
为了方便使用与记忆,我们一般会在app的路由中,加入以蓝图名称命名的前缀
这样我们就需要访问 127.0.0.1:5000/user
1.2 与应用对象不在同一文件的蓝图
我们大多数情况是在别的文件中定义蓝图,首先我们要在项目路径下创建一个python包
创建之后我们发现会有一个空的 __init__.py,我们在里面创建一个蓝图对象
之后在路径other_bule_print 创建一个py文件来存放视图,这里我们就叫views.py
- 视图可以和蓝图放在一起,也可以不放在一起,这里我们就使用更复杂的不放在一起的方法
在vies.py中导入蓝图后,定义一个蓝图中的路由与视图
之后我们回到我们开服务的main.py,先从文件中导入蓝图,之后注册
这里我们如果直接访问的话是404,这是因为没加载views.py,所以我们要在other_bule_print的__init__.py中加载views.py
这里要注意这个导入一定要写在定义蓝图的后面,要不到视图哪里会找不到other_bule_print
修改之后我们呢再访问一下
1.3 蓝图的静态文件
创建蓝图对象时加入参数static_folder
- 不加是不行的,蓝图对象的static_folder默认为None
我们在这里创建一个文件夹static,然后放一张图片进去
之后我们访问一下 http://127.0.0.1:5000/other_bule_print/static/flask.png
发现可以访问到这个图像
使用static_url_path可以定义静态文件的url,template_folder可以定义模板文件路径,在这里就不展示了
2 路由转换器
2.1 不添加过滤器
- 路由的转换实际上就是对get请求的操作
我们一般使用路由转换处理非敏感的数据(如小说网站的小说页数等),在flask中我们这样写
这时我们访问一下该路由
2.2 添加过滤器
那么如果我想对路由的格式有要求,那么我应该这样写
这里我们要求的是整形,我们先给个整形访问一下
发现函数接收的变量也是整形
我们现在给一串字符试一下
发现如果是一串字符就会返回404,404就不会print出我们的内容了
除了整形之外,Flask还内置了其他类型的转换器
- default 默认,无限制
- string 无限制,如果你输入了一个18进去,它是字符串类型的,在默认中输入18进去也是字符串类型的
2.2.1 any过滤器
前两个相当于没有,下面我们给一个any的例子
如果不在这个迭代器中的元素就会返404,我们访问一个在迭代器中的
- 迭代器中的元素类型必须为字符
2.2.2 path过滤器
之后我们给一个path过滤器的例子
感觉上和string的差不多,我们后续如果有用到不同的我们再说
2.2.3 uuid 过滤器
uuid说明 UUID_百度百科
我们也简单用一下,后面如果提到会再讲
2.2.4 其他过滤器
我们也可以对传进来的数据设置最大值或最小值,那么我们应该这样写
- 把min改为max就是对最大值的限制
我们先输入18试一下
发现没有问题,我们再输入16试一下
发现返回404
这里我们就不测试所有的了,后面用到会再提
2.2.5 自定义过滤器
上面提到的过滤器除了int,float其他的其实一般都不用,我们一般会自己写一套方法进行过滤,我们这样写
首先导入werkzeug,然后使用其中的BaseConverter,BaseConvter是自定义过滤器的基类
之后我们自定义一个类,里面创建后搞一个属性regex,这个名称是固定的,然后在里面写上正则表达式
- 正则表达式有问题的话可以看一下这个 正则表达式_potato123232的博客-CSDN博客
之后使用url_map把过滤器注册给app,之后写上路由和视图
然后我们访问一下
自定义过滤器一共有三个变量
- custom_class 过滤器的类
- custom 过滤器的名字
- custom_num 过滤器给路由与视图的变量
3 flask中的request对象
flask中的request对象不同与django每个视图都有,flask的request对象是全局对象,使用时需要导入
对象中有如下属性
3.1 get请求
我们现在发一个get请求(浏览器访问)看一下,首先写一个路由,由于怕与蓝图的路由有冲突,所以我在app中定义路由
然后我们访问一下
3.2 post发送一段json信息
我们现在上传一个图像看看,首先我们先把要发送的图像准备好,我们发送python.jpg这个图像
然后我们写一个请求代码
之后我们写服务
开启服务后我们运行请求代码
运行后会返回done以及生成demo.jpg,我们看一下这张图像
发现符合我们的预期,最后我们看一下服务端print出来的信息
请求的数据很多我就不截全了,这个是图像的字符形式
我们再看一下剩下的信息
- 在字符串中br(换行)是不生效的
3.3 post发送一个文件
- 图像也算文件是可以用这种方式发送过来的
我们首先写一个请求,把我们目录下的main.py发送过来
之后我们写服务,上面的例子实际上发送的是一串json信息,这次是发送的文件
我们运行一下请求代码
发现返回200我们的请求成功了,之后我们再看一下main
这里就有了我们请求的文件信息,之后我们再看一下目录
发现有这个file.py文件且与我们main.py的内容一致