带你读《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()
相关文章
|
16天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
103 45
|
4天前
|
关系型数据库 数据库 数据安全/隐私保护
Python Web开发
Python Web开发
19 6
|
9天前
|
开发框架 前端开发 JavaScript
利用Python和Flask构建轻量级Web应用的实战指南
利用Python和Flask构建轻量级Web应用的实战指南
30 2
|
12天前
|
API 数据库 开发者
深度剖析Django/Flask:解锁Web开发新姿势,让创意无限延伸!
在Web开发领域,Django与Flask如同两颗璀璨的星辰,各具特色。Django提供全栈解决方案,适合快速开发复杂应用;Flask则轻量灵活,适合小型项目和API开发。本文通过问答形式,深入解析两大框架的使用方法和选择策略,助你解锁Web开发新技能。
27 2
|
12天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
27 1
|
14天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
17天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
29 2
|
18天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
25 2
|
8天前
|
数据库 Python
从零开始构建你的第一个Flask Web应
从零开始构建你的第一个Flask Web应
|
11天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。