Flask框架简单介绍

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