第2章 Flask快速上手
Flask是一个使用Python编写的轻量级Web应用框架。何谓Web应用框架?Web应用框架(Web application framework)是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。使用Web应用框架可以节约项目开发的时间和成本。Web开发中有一些共同的功能已经实现了,共同的功能指的是数据库驱动、网页模板引擎、Session和Cookie等基础功能,开发设计人员只要使用框架提供的方法,就可以快速高效地进行Web应用开发。Flask框架诞生于2010年,其作者为Armin Ronacher。本来这个项目只是作者在愚人节的一个恶作剧,后来该框架受到了广大开发者的喜爱,进而成为一个正式的项目。本章主要介绍Flask的基础知识、URL传递参数和URL反转等内容。
本章主要涉及的知识点有:
- Web初步知识;
- Flask程序的基本结构;
- URL传递参数;
- URL反转。
2.1 Web基础知识
Web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP协议的、全球性的、动态交互的、跨平台的分布式图形信息系统,是建立在互联网上的一种网页浏览交互服务,为访问者在互联网上查找和浏览信息提供了图形化的直观人机交互接口界面,其中的文档和超链接的组合更是将互联网上的信息流节点组织成一个互为联系的网络格子状结构。
万维网的工作原理是:当你请求一个网络资源的时候,应该在浏览器上输入所要访问网页的统一资源定位符(Uniform Resource Locator,URL),当然,也可以通过超链接方式链接定位到要请求的那个网页或静/动态资源。之后是对URL根据分布于全球的因特网域名解析系统的数据库进行查询解析,并根据解析结果决定访问哪一个IP地址对应的服务器。接下来是向对应的Web服务器发出一个HTTP请求,相应的Web服务器接收HTTP请求后,调用相应的Web应用处理请求,然后Web服务器再将响应结果(响应结果指的是图片、超文本标记语言,即HTML、JavaScript和视频等资源)返回给客户端浏览器。Web工作原理如图2.1所示。
通常的URL一般由传输协议名、资源所在的主机名或IP地址、网络服务程序的端口号和(目录)文件名等几个部分组成,即:
URL=传输协议+主机名+端口号+(目录)文件名。
传输协议一般是http(HyperText Transfer Protocol,超文本传输协议)或https(HyperText Transfer Protocol over Secure Socket Layer,安全套接字层超文本传输协议)。主机名这里主要指服务(www)+域名(如:google.com)。端口号是可选的,没有给出的话,默认端口一般是指80号端口(http协议使用的80端口,https协议使用的443端口)。目录的出现是在网站结构复杂时,某些资源会放到某个目录下或若干个目录下,这样就构成了文件的路径。文件名精确地指定了要访问的Web页面。未指定文件名时,处理请求的Web服务器会根据服务器本身的设置查找出默认的文件,如index.html、default.jsp等。
2.2 第一个Flask Web程序
Flask是一个基于Python语言的微型Web框架。之所以被称为微型,是因为其核心非常小,但是该Web框架简约而不简单,具有很强的扩展能力。本节介绍如何编写和运行第一个Flask Web应用程序。
2.2.1 安装Flask框架
要使用Flask框架,必须先安装Flask。安装主要方式有两种。
1.在PyCharm中安装Flask
(1)执行File | Settings命令,如图2.2所示。
(2)在上一步操作基础上,继续执行Project:untitled(untitled为工程名,要根据实际的工程名来选择)|Project Interpreter,如图2.3所示。
(3)单击图2.3中的“+”号按钮后,弹出如图2.4所示对话框,在输入框中输入Flask,然后回车。
(4)安装成功以后,如图2.5所示。
2.用pip方式安装Flask
笔者的虚拟环境地址为J:flask-venvvenv,在cmd下按以下步骤操作:
(1) cd j:
(2) cd J:\flask-venv\venv\Scripts
(3) activate
上面3个命令的每个命令输入完后都需要回车。执行完这3个命令后,表示成功激活当前虚拟环境。在(venv)J:flask-venvvenvScripts>下输入pip install Flask,即:
(venv)J:\flask-venv\venv\Scripts> pip install Flask
然后回车,即可安装Flask了。
2.2.2 在Flask中输出Hello World
所有的Flask程序都必须创建一个程序实例。Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所有请求都转给这个对象进行处理。程序实例是Flask类的对象,经常使用下述代码创建:
from flask import Flask
app = Flask(__name__)
from flask import Flask这行代码表示从Flask框架中引入Flask对象。app = Flask(__name__)这行代码表示传入__name__这个变量值来初始化Flask对象,Flask用这个参数确定程序的根目录,__name__代表的是这个模块本身的名称。
使用route()装饰器注明通过什么样的URL可以访问函数,同时在函数中返回要显示在浏览器中的信息。代码如下:
@app.route('/')
def index():
return 'Hello World!'
@app.route('/')这行代码指定了URL与Python函数的映射关系,我们把处理URL和函数之间关系的程序定义为路由,把被装饰的函数index()注册为路由,此处注册给index()函数的路由为根目录。
这里的index()函数叫做视图函数,视图函数必须要有返回值,返回价值为字符串或简单的HTML页面等内容。
系统初始化了,路由和视图函数有了,Flask程序如何运行呢?Flask程序的运行需要服务器环境,我们可以通过run方法来启动Flask自身集成的服务器。代码如下:
if __name__=='__main__':
app.run(debug=True)
如果__name__=='__main__',就要启用Web服务来运行上面的程序,服务器一旦开启,就会进入轮询状态,等待并处理请求。在app.run()中可以传入一些参数,比如debug,app.run(debug=Ture),表示设置当前项目为debug模式,也就是调试模式。如果设置了调试模式,遇到程序有错误,会在控制台输出具体的错误信息,否则只会笼统地报告“应用服务器错误”的信息。另一方面,如果设置为调试模式,期间又修改了程序代码,系统会自动重新将修改的代码提交给Web服务器,你只需要确保浏览器没有缓存,便可以得到最新修改的代码结果。
app.run()还可以传入端口等信息,比如app.run(host='0.0.0.0',port=8080),host='0.0.0.0'参数设置启用本机的IP地址可以访问,端口地址指定为8080,如果不指定,则为5000。
接下来,在PyCharm中实现上述项目。
在PyCharm中新建一个名称为2-1的工程(新建工程注意使用已经存在的“虚拟环境”),如图2.6所示。
app.py的内容见例2-1。
运行程序,结果如图2.7所示。
如果启用的端口不是5000端口,这里port=8888在笔者的PyCharm 2018.2.1版本中是不会生效的,访问地址仍然为http://127.0.0.1:5000/ ,为使新端口地址生效,还需要做进一步设置。
(1)执行Run | Edit Configurations命令,如图2.8所示。
(2)弹出如图2.9所示对话框。
(3)在Additional options输入框中输入“--host=192.168.31.118 --port=8888”(192.168.31.118为笔者计算机的IPv4地址),当然这里你也可以输入“--host=127.0.0.1 --port=8888”。接下来,在浏览器地址栏可以输入http://192.168.31.118:8888/ 访问网页,192.168.31.118一个网段内的局域网计算机也可以通过http://192.168.31.118:8888/ 访问到此网页的内容。
2.3 URL传递参数
Flask中如果要传递一个变量或者一个参数,可以通过表单和地址栏两种方式来传递。其中,通过浏览器地址栏URL方式传递/获取某个变量或参数使用得比较多。这样,我们可以使用相同的URL指定不同的参数,来访问不同的内容。
Flask通过URL传递参数,传递参数的语法是:'/<参数名>/'。需要注意两点:参数需要放在一对< >(尖括号)内;视图函数中需要设置同URL中相同的参数名。
下面在PyCharm中新建一名称为2-2的工程。
02行表示导入Flask模块;03行表示Flask实例化;04行定义路由;05行定义视图函数;06行是返回值;07行定义路由;08行表示返回值;09、10行表示如果某模块被直接运行,则其__name__为'__main__',条件为真,就开启调试模式。
?注意:在Python中,所有没有缩进的代码都会被执行,__name__是Python的内建函数,指的是当前模块的名称,每个模块都有自己的__name__属性,但__name__的值是会变化的,如果某模块被直接运行,则其__name__为'__main__',条件为真,就可以执行app.run()方法,使得整个程序得以运行。当模块被导入时,代码不被运行。
如果07行代码中name没有指定数据类型,那么默认就是string数据类型。在浏览器的地址栏中输入 http://127.0.0.1:5000/user/zhangsan ,回车后便可以得到如图2.10所示的访问结果。
如果此时在浏览器地址栏输入的内容为 http://127.0.0.1:5000/USER/zhangsan,回车后还可以得到如图2.8所示结果吗?结果显然是否定的。因为这里的user是区分大小写的。
在if name == '__main__':这行代码之上继续增加如下代码:
@app.route('/news/<int:id>')
def list_news(id):
return "接收到的id为%s" % id
在浏览器地址栏输入http://127.0.0.1:5000/news/1 ,回车后便可以得到如图2.11所示结果。
如果在浏览器的地址栏输入http://127.0.0.1:5000/news/1.1 ,回车后还可以得到正确的结果吗?结果显然也是否定的。定义成int数据类型的URL只能传递int类型,定义成float数据类型时,URL只能传递float类型,即定义的是什么数据类型,URL传递的参数就必须为对应的数据类型。
2.4 URL反转
在2.3节中,我们设定了一些函数访问URL。有时候,在作网页重定向或是模板文件时需要使用在视图函数中定义的URL,我们必须根据视图函数名称得到当前所指向的URL,这就是URL反转。下面通过一个实例来看URL反转的使用。
下面在PyCharm中新建一名称为2-3的工程。
使用URL反转,用到了url_for()函数,需要使用from flask import url_for导入,url_for() 函数最简单的用法是以视图函数名作为参数,返回对应的URL。例如,在上面的程序中如果用url_for('index'),得到的结果是/,运行上述代码,结果如图2.12所示。
2.5 页面跳转和重定向
用户在访问某个页面的时候,我们希望他登录后才能访问该页面,如果此时他没有登录,系统就让浏览器由当前页面跳转到登录页面,这里就涉及页面重定向问题。所谓页面重定向,就是用户在打开某个页面的时候,我们期望页面跳转到另一个指定的页面,让用户完成某种操作或执行某个动作。
Flask中提供了重定向函数redirect(),该函数的功能就是跳转到指定的URL。下面在PyCharm中新建一名称为2-4的工程。
02行表示当模块被直接运行时,代码将被运行,当模块被导入时,代码不被执行;03行表示Flask初始化;04行定义路由;05行表示定义视图函数;06行表示打印输出;07行表示URL反转;08行表示网页重定位;09行表示定义路由;10行表示定位视图函数;11行表示返回值;12行表示当模块被直接运行时,代码将被运行,当模块被导入时,代码不被执行。
重定向是将原本的URL重新定向成为一个新的URL,可以实现页面的跳转。Flask中使用到了redirect()函数,需要使用from flask import redirect将其导入才能使用。这里输入地址访问的首先应该是index()这个视图函数,但是index()这个视图函数直接跳转到了user_login视图上,运行结果如图2.13所示。
2.6 温 故 知 新
1.学完本章内容后,读者需要回答:
(1)什么是Flask?
(2)URL如何传递参数?
(3)网页如何重定向?
2.在下一章中将会学习:
(1)模板及Flask模板渲染。
(2)模板中传参的方法。
(3)模板中的条件语句和循环语句的使用。
2.7 习 题
通过下面的习题来检验本章的学习情况,习题答案请参考本书配套资源。
【本章习题答案见配套资源源代码C2习题】
有如下代码,对其进行URL反转(从视图函数到URL的转换),在index()视图函数中,请打印输出my_list()函数的反转地址。
# encoding utf-8
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World!'
@app.route('/list/')
def my_list():
return 'list'
if __name__ == '__main__':
app.run()