python之flask框架

一、什么是web框架?

web框架全称为web应用框架,用来支持动态网站、网络应用程序和网络服务的开发,框架会提供如下常用功能:

  1. 管理路由
  2. 访问数据库
  3. 管理会话和cookies
  4. 创建模板来显示html
  5. 促进代码的重用

Python常用的web框架如下:

Flask、Django、Bottle、Tornado

二、Flask框架的使用:

Flask框架依赖两个外部库:Werkzeug和Jinjia2, Werkzeug 是一个WSGI工具集, Jinjia2 负责渲染模板,所以在安装Flask之前需要安装这两个外部库,最简单的安装方式是通过Virtualenv创建虚拟环境。

为什么要使用虚拟环境?随着你的 Python 项目越来越多,你会发现不同的项目会需要 不同的版本的 Python 库。同一个 Python 库的不同版本可能不兼容, 虚拟环境可以为每一个项目安装独立的 Python 库,这样就可以隔离不同项目之间的 Python 库,也可以隔离项目与操作系统之间的 Python 库。

1、安装 Virtualenv虚拟环境

pip install Virtualenv

安装完成后可以使用如下命令查看是否安装成功,如下:

virtualenv –version

2、创建虚拟环境;

通过命令virtualenv命令在当前文件夹中(也可以自定义文件夹)创建python虚拟环境,一般虚拟环境的名字都是命名为venv,命令如下:

virtualenv venv

如上图,我在D盘下的python文件夹中创建虚拟环境,创建后可以看到venv文件夹

3、激活虚拟环境:

在使用虚拟环境之前,需要先将其激活,使用命令如下:

4、安装flask:(注意是在venv环境下)

pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后执行命令pip list –format columns查看所有安装包,如图:

5、第一个flask程序:

在venv同级目录下创建hello.py文件,代码内容如下:

通过Python hello.py运行此文件(必须先进入虚拟环境中),如图:

运行后通过本地浏览器输入127.0.0.1加上端口5000访问,如图:

注意:从python3.3之后的版本中,已经自带了虚拟环境venv,如果通过pycharm创建项目,默认也是直接在虚拟环境中,如图:

上图中的命令行后面可直接通过pip来安装需要的包,每个项目之间互不影响

6、开启调试模式:

虽然使用run()方法适用于启动本地的开发服务器,但是每次修改代码后都需要重新手动重新启动,很繁琐,如果启用了调试模式,那么服务器会在代码修改后自动重新载入,无需手动重启,在代码发生错误的时候也会自动停止,开启调试模式方法如下:

上图中的方式表示第一种方式开启调试模式,还有一种方式是直接作为run方法的参数传入,如下:

注意:开启了调试模式后,无论如何修改内部代码,都不需要重新启动(python hello.py),会自动重新载入的,代码发生错误后将自动停止。

注意:在开发阶段可以开启调式模式,上线后不建议开启,容易暴漏一些端口以及数据库信息

路由:

客户端(web浏览器)把请求发送给web服务器,web服务器再把请求发送给flask程序实例,程序实例需要知道对每个url请求运行了哪些代码,所以保存了一个URL到Python函数的映射关系,处理URL和函数之间关系的程序称为路由。

在flask中,定义路由最简便方式,是使用程序实例提供的app.route修饰器,把修饰的函数注册为路由,如下说明了如何使用修饰器声明路由:

@app.route('/')
    def hello_world():
        return  'hello world!'

注意:修饰器是Python语言的标准特性,可以使用不同的方式修改函数的行为,常用的方式是使用修饰器将函数注册为事件的处理程序,而且不一定非要为app.route,test.route也可以的,一般通常使用app

不仅如此,还可以构造含有动态部分的URL,也可以在一个函数上附着多个规则

1、变量规则:

要给URL添加变量部分,可以把这些特殊的字段标记为<variable_name>,这个部分将会作为命令参数传递到函数中,规则可以用<converter:variable_name>指定一个可选的转换器。

例如:在上方代码基础上添加内容如下:

上述代码中使用了转换器,有以下几种:

  1. int:表示接受整数
  2. float:表示接受浮点数
  3. path:和默认相似,也接受斜线

接下来在浏览器中输入http://127.0.0.1:5000/user/test 后可以看到显示内容如下:

将地址修改为http://127.0.0.1:5000/post/1000,看到内容如下:

注意第二个只能输入整数,不能输入字符串,因为转换器为整型

2、构造URL:

flask能匹配URL,同时也可以构造URL,使用url_for()来给指定的函数构造URL,它接受函数名作为第一个参数,也接受对应URL规则的变量部分的命令参数,未知变量部分会添加到URL末位作为查询参数。

例如:在上方代码基础上添加如下代码,实现构造URL,如图:

上述代码中,设置”/usl/”路由,访问该路由时候,返回show_post函数的URL信息,如图:

3、HTTP方法:

HTTP(与web应用会话的协议)有很多不同的访问URL的方法,默认情况下,路由只回应GET请求,但是通过route()装饰器传递methods参数可以改变这个行为,如图

常用的HTTP方法以及说明

方法名说明
GET浏览器告诉服务器,只获取页面上的信息并发给我,这只最常用的方法
HEAD浏览器告诉服务器,想要获取信息,但是只关心消息头
POST浏览器告诉服务器,想在URL上发布信息,并且,服务器必须确保数据已经存储并且只存储了一次,这是HTML发送数据到服务器常用的方法
PUT类似POST,但是服务器可能触发了存储过程多次,多次覆盖掉旧值
DELETE删除给定位置的信息
OPTIONS给客户端提供一个敏捷的途径来弄清楚这个URL支持哪些HTTP方法,从flask0.6开始支持自动处理

4、重定向:

在Web程序中,我们经常需要进行重定向。比如,当某个用户在没有经过认证的情况下访问需要登录后才能访问的资源,程序通常会重定向到登录页面。 对于重定向这一类特殊响应, 我们可以使用Flask提供的redirect()函数来生成重定向响应,重定向的目标URL作为第一个参数

例如:通过redirect()函数来重定向默认url到百度,如图:

使用redirect()函数时,默认的状态码为302,即临时重定向。如 果你想修改状态码,可以在redirect()函数中作为第二个参数或使用 code关键字传入。

如果要在程序内重定向到其他视图,那么只需在redirect()函数中 使用url_for()函数生成目标URL即可, 如图:

5、一个函数匹配多个url

一个函数可以对应多个URL这样就省去了重定向的烦恼,如下:

静态文件

动态web应用也会用到静态文件,通常为CSS和JS文件,在使用flask开发中,只需要在你的包或者模块所在的目录中创建一个static的文件夹,在应用中使用/static访问即可

给静态文件生成URL,使用特殊的static断点名,如下:

url_for(‘static’,filename = ‘style.css’)

这个文件应该存在文件系统的static/style.css

模板

模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只要在请求的上下文中才能知道,使用真实值替换变量,再返回最终的得到的响应字符串,Flask使用了一个强大的Jinja2模板引擎。

1、渲染模板:

默认情况下,flask会在程序文件夹中的template子文件夹中寻找模板

例如:在包文件夹下创建templates模板文件夹,内部创建两个文件home.html和user.html,然后在templates同级目录下定义文件template.py文件,通过此文件来渲染模板文件,如图:

文件的结构如图:

home.html文件内容如下:

user.html文件内容如下:

template.py内容如下:

上图中Flask提供的render_template()函数将Jinja2模板引擎集成到程序中,render_template()函数的第一个参数为模板中的文件名(如上图中的user.html),后面的参数都是键值对,表示模板中变量对应的真实值,上图中,模板user.html中定义了一个变量name,在渲染文件template.py的render_template的参数name=username中,name对应的就是模板文件user.html中的变量name(占位符),username表示路由中传入的变量

接下来运行template.py不加参数的情况下访问,如图:

加了参数后,访问内容如下:

2、变量:

上面的模板文件user.html中的{{name}}表示一个变量,它是一种特殊的占位符,告诉模板引擎这个值从渲染模板时使用的数据中获取,Jinja2能识别所有类型的变量,甚至一些复杂的类型,如列表、字典和对象,例如:

<p>从字典中取一个值: {{ dict['key'] }} </p>
<p>从列表中取一个值:{{ list[3] }} </p>
<p>从列表中取一个带索引的值: {{ list[index] }} </p>
<p>从对象的方法中取一个值: {{ myobk.sommethod() }} </p>

可以使用过滤器修改变量,过滤器添加在变量名之后,中间使用竖线分隔

例如:修改上述模板文件user.html,将变量name以首字母大写方式显示,如图:

首先修改模板文件user.html,设置变量真实值首字母大写,如图:

执行template.py后,查看路由结果,可以看到首字母已经变为大写,如图:

Jinja2提供的部分常用过滤器如下:

名称说明
safe渲染时不转义
capitalize把值的首字母转换为大写,其余转换为小写
lower把值转换为小写形式
upper把值转换为大写形式
titile把值中的每个单词的首字母都转换为大写
trim把值的首尾空格去掉
striptags渲染之前把值中所有的HTML标签都删掉

注意:safe过滤器值得说明一下,默认情况下,出于安全考虑,Jinja2会转义所有变量,但是,如果变量的值需要为'<h1>hello</h1>’,变量的值需要带标签,Jinja2会将其渲染成'<h1>hello&lt/h1/>’,此时浏览器能显示h1元素,但是不会进行解析,很多时候需要显示html代码,此时可以使用safe过滤器

3、控制结构:

Jinja2提供了多种控制结构,用来改变模板的渲染流程

例如:修改上面例子中的渲染文件template.py,将路由信息指向到模板文件user.html,如图:

模板文件user.html内容如下:

从上图可以看出,控制语句,当有参数传入的时候(页面传入),打印传入变量的值(name),如果没有参数传入打印默认的值hello,gongguan

注意:上图中用if语句开始,endif语句结束

接下来启动渲染文件template.py,浏览器访问,如果不传入任何参数,如图:

当传入参数的时候,打印内容如图:

还有一种需求是在模板中渲染一组元素,下面使用for循环来实现

例如:修改渲染文件template.py,添加字典内容content,不加参数访问浏览器时,将此内容传递给模板文件user.html,修改user.html文件,定义for循环的控制结构来便利参数,如图:

注意:上图中通过for语句开始,endfor语句结束

浏览器访问后的内容如下:

Jinja2还支持宏,宏类似于Python中的函数

例如:下面的例子表示通过宏的方式来获取变量并遍历,如图:

模板文件user.html文件内容如下:

渲染文件template.py的内容如下:

使用宏的主要目的是可以重复的使用,此时可以将宏保存在一个单独的文件中

在模板文件user.html同级位置创建宏文件,macro.html,如图:

模板文件user.html中导入宏文件,并遍历,如图:

模板中语法如下:

  • {% …… %}:语句, 比如if判断、for循环等
  • {{ …… }}:表达式, 比如字符串、变量、函数调用等
  • {#……#} : 注释

标签