带你读《Python Flask Web开发入门与项目实战》之二:Flask快速上手

简介: 本书从Flask框架的基础知识讲起,逐步深入到使用Flask进行Web应用开发实战。内容通俗易懂,案例丰富,实用性强,特别适合Python Web开发的入门读者和进阶读者学习,也适合PHP程序员和Java程序员等其他Web开发爱好者阅读。另外,本书可以作为相关培训机构的教材用书。

点击查看第一章
点击查看第三章

第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所示。

image.png

  通常的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所示。

image.png

  (2)在上一步操作基础上,继续执行Project:untitled(untitled为工程名,要根据实际的工程名来选择)|Project Interpreter,如图2.3所示。

image.png

  (3)单击图2.3中的“+”号按钮后,弹出如图2.4所示对话框,在输入框中输入Flask,然后回车。

image.png

  (4)安装成功以后,如图2.5所示。

image.png

  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了。

image.png

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所示。

image.png

  app.py的内容见例2-1。

image.png

  运行程序,结果如图2.7所示。

image.png

  如果启用的端口不是5000端口,这里port=8888在笔者的PyCharm 2018.2.1版本中是不会生效的,访问地址仍然为http://127.0.0.1:5000/ ,为使新端口地址生效,还需要做进一步设置。
  (1)执行Run | Edit Configurations命令,如图2.8所示。

image.png

  (2)弹出如图2.9所示对话框。

image.png

  (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/ 访问到此网页的内容。

image.png

2.3 URL传递参数

  Flask中如果要传递一个变量或者一个参数,可以通过表单和地址栏两种方式来传递。其中,通过浏览器地址栏URL方式传递/获取某个变量或参数使用得比较多。这样,我们可以使用相同的URL指定不同的参数,来访问不同的内容。
  Flask通过URL传递参数,传递参数的语法是:'/<参数名>/'。需要注意两点:参数需要放在一对< >(尖括号)内;视图函数中需要设置同URL中相同的参数名。
  下面在PyCharm中新建一名称为2-2的工程。

image.png


  
  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所示结果。

image.png

  如果在浏览器的地址栏输入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的工程。

image.png
image.png


  
  使用URL反转,用到了url_for()函数,需要使用from flask import url_for导入,url_for() 函数最简单的用法是以视图函数名作为参数,返回对应的URL。例如,在上面的程序中如果用url_for('index'),得到的结果是/,运行上述代码,结果如图2.12所示。

image.png

2.5 页面跳转和重定向

  用户在访问某个页面的时候,我们希望他登录后才能访问该页面,如果此时他没有登录,系统就让浏览器由当前页面跳转到登录页面,这里就涉及页面重定向问题。所谓页面重定向,就是用户在打开某个页面的时候,我们期望页面跳转到另一个指定的页面,让用户完成某种操作或执行某个动作。
  Flask中提供了重定向函数redirect(),该函数的功能就是跳转到指定的URL。下面在PyCharm中新建一名称为2-4的工程。

image.png


  
  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所示。

image.png

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()
相关文章
|
1天前
|
机器学习/深度学习 数据采集 数据可视化
利用Python进行历史数据预测:从入门到实践的两个案例分析
利用Python进行历史数据预测:从入门到实践的两个案例分析
13 1
|
7天前
|
机器学习/深度学习 自然语言处理 语音技术
【Python 机器学习专栏】Python 深度学习入门:神经网络基础
【4月更文挑战第30天】本文介绍了Python在深度学习中应用于神经网络的基础知识,包括神经网络概念、基本结构、训练过程,以及Python中的深度学习库TensorFlow和PyTorch。通过示例展示了如何使用Python实现神经网络,并提及优化技巧如正则化和Dropout。最后,概述了神经网络在图像识别、语音识别和自然语言处理等领域的应用,并强调掌握这些知识对深度学习的重要性。随着技术进步,神经网络的应用将持续扩展,期待更多创新。
|
7天前
|
机器学习/深度学习 算法 数据挖掘
【Python 机器学习专栏】Python 机器学习入门:基础概念与流程
【4月更文挑战第30天】本文介绍了Python在机器学习中的重要性,机器学习的基础概念和分类,包括监督学习、非监督学习和强化学习。Python因其丰富的库(如Scikit-learn、TensorFlow、PyTorch)、简单易学的语法和跨平台性在机器学习领域广泛应用。文章还概述了机器学习的基本流程,包括数据收集、预处理、特征工程、模型训练与评估等,并列举了常用的Python机器学习算法,如线性回归、逻辑回归、决策树和支持向量机。最后,讨论了Python机器学习在金融、医疗、工业和商业等领域的应用,鼓励读者深入学习并实践这一技术。
|
9天前
|
Python
【Python21天学习挑战赛】-入门必备
【Python21天学习挑战赛】-入门必备
|
11天前
|
XML 安全 Java
从零手写实现 apache Tomcat-02-web.xml 入门详细介绍
`web.xml`是Java Web应用的核心配置文件,描述应用工作方式。它包含Servlet、Filter和Listener的定义。例如,示例展示了如何配置名为`my`的Servlet处理`/my`请求,`LoggingFilter`拦截所有请求,以及`MyServletContextAttrListener`监听应用事件。`web.xml`是服务器理解应用结构与行为的指南。迷你版Tomcat实现——mini-cat(开源:https://github.com/houbb/minicat)。
|
13天前
|
存储 Python
python入门指南
python入门指南
19 0
|
13天前
|
机器学习/深度学习 自然语言处理 算法
利用Python进行情感分析:从入门到实践
【4月更文挑战第24天】 在数字化时代,文本数据无处不在。理解这些文本背后的情绪倾向对于品牌管理、市场研究乃至政治分析都至关重要。本文将引导读者通过Python编程语言实现基本的情感分析任务,涵盖从预处理步骤到模型训练和结果解释的全过程。我们将使用流行的自然语言处理库NLTK和机器学习框架scikit-learn来构建一个简单的情感分析模型,并探索如何将其应用于实际场景中。
|
13天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
13天前
|
存储 索引 Python
Python从入门到精通——1.3.1练习编写简单程序
Python从入门到精通——1.3.1练习编写简单程序
|
13天前
|
Python
Python从入门到精通——1.2.2学习基础语法和数据类型之控制结构
Python从入门到精通——1.2.2学习基础语法和数据类型之控制结构