赵走x博客
网站访问量:151925
首页
书籍
软件
工具
古诗词
搜索
登录
Flask 实战:41、电子邮件进阶实践
Flask 实战:40、使用事务邮件服务SendGird
Flask 实战:39、使用Flask-Mail发送电子邮件
Flask 实战:38、数据库进阶实践
Flask 实战:37、更新数据库表
Flask 实战:36、定义关系
Flask 实战:35、在视图函数里操作数据库
Flask 实战:34、数据库操作:CRUD
Flask 实战:33、使用Flask-SQLAlchemy管理数据库
Flask 实战:32、ORM魔法
Flask 实战:31、数据库的分类
Flask 实战:30、单个页面多个表单
Flask 实战:29、单个表单多个提交按钮
Flask 实战:28、使用Flask-CKEditor集成富文本编辑器
Flask 实战:27、多文件上传
Flask 实战:26、文件上传
Flask 实战:25、自定义验证器
Flask 实战:24、使用宏渲染表单
Flask 实战:23、设置错误消息语言
Flask 实战:22、处理表单数据
Flask 实战:21、使用Flask-WTF处理表单
Flask 实战:20、HTML表单
Flask 实战:19、模板进阶实践
Flask 实战:18、模板结构组织
Flask 实战:17、模板辅助工具
Flask 实战:16、模板基本用法
Flask 实战:15、HTTP进阶实践
Flask 实战:14、Flask上下文
Flask 实战:13、HTTP响应
Flask 实战:12、HTTP请求
Flask 实战:11、请求响应循环
Flask 实战:10、Flask与MVC架构
Flask 实战:9、模板与静态文件
Flask 实战:8、Flask命令
Flask 实战:7、URL与端点
Flask 实战:6、项目配置
Flask 实战:5、Flask扩展
Flask 实战:4、Python Shell
Flask 实战:3、启动开发服务器
Flask 实战:2、Hello,Flask!
Flask 实战:1、初识Flask
Flask 实战:2、Hello,Flask!
资源编号:75830
Python Web
Flask Web开发实战:入门、进阶与原理解析
热度:72
本书的第一部分每一章对应一个示例程序,分别存储在不同文件夹中。
本书的第一部分每一章对应一个示例程序,分别存储在不同文件夹中。 本章的示例程序在2-hello目录下,使用下面的命令切换到该目录: ``` $ cd 2-hello ``` 在hello目录下的app.py脚本中包含一个最小的Flask程序,如代码清单1-1所示。 代码清单1-1 2-hello/app.py:最小的Flask程序 ``` from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '
Hello Flask!
' ``` 你也许已经猜到它能做什么了,下面让我们先来一步步分解这个程序。 > 提示: 对于简单的程序来说,程序的主模块一般命令为app.py。你也可以使用其他名称,比如hello.py,但是要避免使用flask.py,因为这和Flask本身冲突。 # 1、创建程序实例 我们安装Flask时,它会在Python解释器中创建一个flask包,我们可以通过flask包的构造文件导入所有开放的类和函数。我们先从flask包导入Flask类,这个类表示一个Flask程序。实例化这个类,就得到我们的程序实例app: ``` from flask import Flask app = Flask(__name__) ``` 传入Flask类构造方法的第一个参数是模块或包的名称,我们应该使用特殊变量__name__。Python会根据所处的模块来赋予__name__变量相应的值,对于我们的程序来说(app.py),这个值为app。除此之外,这也会帮助Flask在相应的文件夹里找到需要的资源,比如模板和静态文件。 > 提示: Flask类是Flask的核心类,它提供了很多与程序相关的属性和方法。在后面,我们经常会直接在程序实例app上调用这些属性和方法来实现相关功能。在第一次提及Flask类中的某个方法或属性时,我们会直接以实例方法/属性的形式写出,比如存储程序名称的属性为app.name。 # 2、注册路由 在一个Web应用里,客户端和服务器上的Flask程序的交互可以简单概括为以下几步: 1)用户在浏览器输入URL访问某个资源。 2)Flask接收用户请求并分析请求的URL。 3)为这个URL找到对应的处理函数。 4)执行函数并生成响应,返回给浏览器。 5)浏览器接收并解析响应,将信息显示在页面中。 在上面这些步骤中,大部分都由Flask完成,我们要做的只是建立处理请求的函数,并为其定义对应的URL规则。只需为函数附加app.route() 装饰器,并传入URL规则作为参数,我们就可以让URL与函数建立关联。这个过程我们称为注册路由(route),路由负责管理URL和函数之间的映射,而这个函数则被称为视图函数(view function)。 > 附注: 路由的含义可以从字面意义理解,作为动词时,它的含义是“按某路线发送”,即调用与请求URL对应的视图函数。 在这个程序里,app.route()装饰器把根地址/和index()函数绑定起来,当用户访问这个URL时就会触发index()函数。这个视图函数可以像其他普通函数一样执行任意操作,比如从数据库中获取信息,获取请求信息,对用户输入的数据进行计算和处理等。最后,视图函数返回的值将作为响应的主体,一般来说,响应的主体就是呈现在浏览器窗口的HTML页面。在最小程序中,视图函数index()返回一行问候: ``` @app.route('/') def index(): return '
Hello, World!
' ``` 虽然这个程序相当简单,但它却是大部分Flask程序的基本模式。在复杂的程序中,我们会有许多个视图函数分别处理不同URL的请求,在视图函数中会完成更多的工作,并且返回包含各种链接、表单、图片的HTML文件,而不仅仅是一行字符串。返回的页面中的链接又会指向其他URL,被单击后触发对应的视图函数,获得不同的返回值,从而显示不同的页面,这就是我们浏览网页时的体验。 > 提示 route()装饰器的第一个参数是URL规则,用字符串表示,必须以斜杠(/)开始。这里的URL是相对URL(又称为内部URL),即不包含域名的URL。以域名[www.helloflask.com](http://www.helloflask.com) 为例,“/”对应的是根地址(即[www.helloflask.com](http://www.helloflask.com) ),如果把URL规则改为“/hello”,则实际的绝对地址(外部地址)是[www.helloflask.com/hello](http://www.helloflask.com/hello) 。 假如这个程序部署在域名为[www.helloflask.com](http://www.helloflask.com) 的服务器上,当启动服务器后,只要你在浏览器里访问[www.helloflask.com](http://www.helloflask.com) ,就会看到浏览器上显示一行“Hello,Flask!”问候。 > 附注 URL(Uniform Resource Lacator,统一资源定位符)正是我们使用浏览器访问网页时输入的网址,比如[http://helloflask.com/](http://helloflask.com/) 。简单来说,URL就是指向网络中某个资源的地址。 ### 1.为视图绑定多个URL 一个视图函数可以绑定多个URL,比如下面的代码把/hi和/hello都绑定到say_hello()函数上,这就会为say_hello视图注册两个路由,用户访问这两个URL均会触发say_hello()函数,获得相同的响应,如代码清单1-2所示。 ``` @app.route('/hi') @app.route('/hello') def say_hello(): return '
Hello, Flask!
' ``` ### 2.动态URL 我们不仅可以为视图函数绑定多个URL,还可以在URL规则中添加变量部分,使用“<变量名>”的形式表示。Flask处理请求时会把变量传入视图函数,所以我们可以添加参数获取这个变量值。代码视图函数greet(),它的URL规则包含一个name变量。 ``` @app.route('/greet/
') def greet(name): return '
Hello, %s!
' % name ``` 因为URL中可以包含变量,所以我们将传入app.route()的字符串称为URL规则,而不是URL。Flask会解析请求并把请求的URL与视图函数的URL规则进行匹配。比如,这个greet视图的URL规则为/greet/
,那么类似/greet/foo、/greet/bar的请求都会触发这个视图函数。 > 附注 顺便说一句,虽然示例中的URL规则和视图函数名称都包含相同的部分(greet),但这并不是必须的,你可以自由修改URL规则和视图函数名称。 这个视图返回的响应会随着请求URL中的name变量而变化。假设程序运行在[http://helloflask.com](http://helloflask.com) 上,当我们在浏览器里访问[http://helloflask.com/hello/Grey](http://helloflask.com/hello/Grey) 时,可以看到浏览器上显示“Hello,Grey!”。 当URL规则中包含变量时,如果用户访问的URL中没有添加变量,比如/greet,那么Flask在匹配失败后会返回一个404错误响应。一个很常见的行为是在app.route()装饰器里使用defaults参数设置URL变量的默认值,这个参数接收字典作为输入,存储URL变量和默认值的映射。在下面的代码中,我们为greet视图新添加了一个app.route()装饰器,为/greet设置了默认的name值: ``` @app.route('/greet', defaults={'name': 'mark'}) @app.route('/greet/
') def greet(name): return '
Hello, %s!
' % name ``` 这时如果用户访问/greet,那么变量name会使用默认值mark,视图函数返回 ```
Hello,mark!
``` 上面的用法实际效果等同于: ``` @app.route('/greet') @app.route('/greet/
') def greet(name='mark'): return '
Hello, %s!
' % name ```