前面两篇文章中咱们已经了解 Web(HTTP)服务器,Web应用程序,Web框架,WSGI这些 Python Web 开发中的概念。咱们知道,Web框架经过将不一样Web应用程序中的共性部分给抽象出来,提供一系列通用的接口,从而避免开发者作重复性工做,让其将精力放在业务相关的实现。html
接下来一块儿来看一个具体的 Web 框架,这里选择 Flask,由于它是一个年轻充满活力的微框架,有着众多的拥护者,文档齐全,社区活跃度高。咱们的论坛项目 就使用了该框架。python
为了理解 Flask 框架是如何抽象出Web开发中的共同部分,咱们先来看看Web应用程序的通常流程。对于Web应用来讲,当客户端想要获取动态资源时,就会发起一个HTTP请求(好比用浏览器访问一个 URL),Web应用程序会在后台进行相应的业务处理,(从数据库或者进行一些计算操做等)取出用户须要的数据,生成相应的HTTP响应(固然,若是访问静态资源,则直接返回资源便可,不须要进行业务处理)。整个处理过程以下图所示:git
实际应用中,不一样的请求可能会调用相同的处理逻辑。这里有着相同业务处理逻辑的 HTTP 请求能够用一类 URL 来标识。好比论坛站点中,对于全部的获取Topic内容的请求而言,能够用 topic/<topic_id>/
这类URL来表示,这里的 topic_id 用以区分不一样的topic。接着在后台定义一个 get_topic(topic_id)
的函数,用来获取topic相应的数据,此外还须要创建URL和函数之间的一一对应关系。这就是Web开发中所谓的路由分发,以下图所示:github
Flask底层使用werkzeug来作路由分发,代码写起来十分简单,以下:web
@app.route('/topic/<int:topic_id>/') def get_topic(topic_id): # Do some cal or read from database # Get the data we need.
经过业务逻辑函数拿到数据后,接下来须要根据这些数据生成HTTP响应(对于Web应用来讲,HTTP响应通常是一个HTML文件)。Web开发中的通常作法是提供一个HTML模板文件,而后将数据传入模板,通过渲染后获得最终须要的HTML响应文件。数据库
一种比较常见的场景是,请求虽然不一样,但响应中数据的展现方式是相同的。仍以论坛为例,对不一样topic而言,其具体topic content虽然不一样,但页面展现的方式是同样的,都有标题拦,内容栏等。也就是说,对于 topic 来讲,咱们只需提供一个HTML模板,而后传入不一样topic数据,即获得不一样的HTTP响应。这就是所谓的模板渲染,以下图所示:flask
Flask 使用 Jinja2 模板渲染引擎来作模板渲染,代码以下:浏览器
@app.route('/topic/<int:topic_id>/') def get_topic(topic_id): # Do some cal or read from database # Get the data we need. return render_template('path/to/template.html', data_needed)
总结一下,Flask处理一个请求的流程就是,首先根据 URL 决定由那个函数来处理,而后在函数中进行操做,取得所需的数据。再将数据传给相应的模板文件中,由Jinja2 负责渲染获得 HTTP 响应内容,而后由Flask返回响应内容。服务器
关于 Flask 框架的学习,不建议直接读官网文档,虽然这是一手的权威资料,但并不适合初学者入手。这里推荐几个学习资料,能够帮助新手很快的入门:app
汇智网flask框架教程:一个很是适合入门的精简教程,主要分为七部分:
快速入门
路由:URL 规则与视图函数
请求、应答与会话
上下文对象:Flask 核心机制
模版:分离数据与视图
访问数据库:SQLAlchemy简介
蓝图:Flask应用组件化
教程简练地总结了 Flask 最核心的内容,而且还提供了一个简单的在线练习环境,方便一边学习理论一边动手实践。
此外,麦子学院也有一个 Flask入门 视频教程,一共8小时的视频教程,涵盖flask web 开发的方方面面,包括环境的搭建,flask 语法介绍,项目结构的组织,flask 全球化,单元测试等内容。视频做者有 17 年软件开发经验,曾任微软深圳技术经理及多家海外机构担任技术顾问,够牛!视频讲的也确实不错。
若是上面两个不能知足你,那么还能够看 Flask Web开发:基于Python的Web应用开发实战 这本有着 8.6 评分的书,相信没看完就跃跃欲试想写点什么了。这么优秀的框架,Github 上固然也有 awesome-flask了,想深刻学习flask的话,这里不失为一个好的资源帖。
本篇大概谈了下 Flask 的路由分发和模版渲染,下篇咱们会继续讲Flask使用中的一些问题。
What is the purpose of Flask's context stacks?
Flask 的 Context 机制
Flask、Django、Pyramid三个框架的对比