在前两篇文章中,我们已经了解了PythonWeb开发中的Web(HTTP)服务器、Web应用程序、Web框架、WSGI等概念。我们知道,Web框架通过对不同Web应用的公共部分进行抽象,提供了一系列通用的接口,从而避免了开发人员的重复工作,让他们专注于业务相关的实现。接下来我们来看一个具体的Web框架。这里选择Flask是因为它是一个年轻且充满活力的微框架,拥有众多的支持者、完整的文档和高度活跃的社区。我们的论坛项目就是使用这个框架。Flask框架要了解Flask框架如何抽象Web开发的公共部分,让我们首先看一下Web应用程序的一般流程。对于Web应用,当客户端想要获取动态资源时,会发起一个HTTP请求(比如用浏览器访问一个URL),Web应用会在后台进行相应的业务处理,(从数据库或者执行一些计算操作等)提取用户需要的数据,并生成相应的HTTP响应(当然,如果访问的是静态资源,可以直接返回资源,不需要业务处理)。整个处理流程如下图所示:在实际应用中,不同的请求可能会调用相同的处理逻辑。这里业务处理逻辑相同的HTTP请求,可以通过一类URL来标识。例如,在论坛站点中,所有对主题内容的请求都可以用topic//等URL表示,其中topic_id用于区分不同的主题。然后在后台定义一个get_topic(topic_id)函数,获取topic对应的数据。另外,需要在URL和函数之间建立一一对应关系。这就是web开发中所谓的路由分发,如下图:Flask底层使用werkzeug进行路由分发,代码写起来很简单,如下:@app.route('/topic//')defget_topic(topic_id):#Dosomecalorreadfromdatabase#Getthedataweneed。通过业务逻辑函数获取数据后,需要根据数据生成HTTP响应(对于Web应用,HTTP响应一般是HTML文件)。Web开发中一般的做法是提供一个HTML模板文件,然后将数据传入模板,渲染后得到最终的HTML响应文件。一个比较常见的场景是,虽然请求不同,但是响应中数据的展示方式是一样的。还是以论坛为例,虽然不同的话题具体的话题内容不一样,但是页面的显示方式是一样的,有标题栏,内容栏等。也就是说,对于一个话题,我们只需要提供一个HTML模板,然后传入不同的topic数据,得到不同的HTTP响应。这就是所谓的模板渲染,如下图所示:Flask使用Jinja2模板渲染引擎进行模板渲染,代码如下:@app.route('/topic//')defget_topic(topic_id):#Dosomecalorreadfromdatabase#Getthedataweneed.returnrender_template('path/to/template.html',data_needed)总结一下,Flask处理一个请求的过程就是先根据url决定处理哪个函数,然后在函数中进行操作,获取需要的数据。然后将数据传递给对应的模板文件,Jinja2负责渲染HTTP响应内容,然后Flask返回响应内容。Flask入门关于Flask框架的学习,不建议直接看官网文档。虽然这是第一手的权威资料,但并不适合初学者。这里推荐几本帮助新手快速入门的学习资料:汇智网Flask框架教程:非常适合入门的简洁教程,主要分为七部分:快速入门路由:URL规则和查看函数Requests,ResponsesandSessions上下文对象:Flask核心机制模板:数据视图分离Access数据库:SQLAlchemy蓝图介绍:Flask应用组件化教程简洁概括了Flask的核心内容,同时也提供了一个简单的在线实践环境,方便边学边学理论手。此外,小麦学院还有Flask入门视频教程,共8小时的视频教程,涵盖了FlaskWeb开发的方方面面,包括环境搭建、Flask语法介绍、项目结构组织、Flask全球化、单元测试等.该视频的作者拥有17年的软件开发经验。曾任微软深圳技术经理,海外多家机构技术顾问。太棒了!视频真的很棒。如果以上两点不能满足你,那你还可以看看FlaskWeb开发:基于Python的Web应用开发实战这本书评分8.6。我相信我很想在阅读之前先写点东西。这么优秀的框架,Github上当然有awesome-flask。如果你想了解更多关于Flask的信息,这里有一篇很好的资源文章。这篇文章大致讲了Flask的路由分发和模板渲染。在下一篇文章中,我们会继续聊聊Flask使用中的一些问题。