Python Flask Web 框架入门
<p> <strong><span style="font-size: 18pt">Python Flask 目录</span></strong></p><p><span style="font-size: 14px">本文主要借鉴 letiantian 的文章 http://www.letiantian.me/learn-flask/</span></p>
<p><span style="font-size: 15px">一、简介</span></p>
<p><span style="font-size: 15px">二、安装</span></p>
<p><span style="font-size: 15px">三、初始化Flask</span></p>
<p><span style="font-size: 15px">四、获取URL参数 (GET请求)<br></span></p>
<p><span style="font-size: 15px">五、获取POST方法传送的数据</span></p>
<p><span style="font-size: 15px">六、处理和响应JSON数据</span></p>
<p><span style="font-size: 15px">七、上传文件</span></p>
<p><span style="font-size: 15px">八、Restful URL</span></p>
<p><span style="font-size: 15px">九、使用url_for生成链接</span></p>
<p><span style="font-size: 15px">十、使用redirect重定向网址</span></p>
<p><span style="font-size: 15px">十一、使用Jinja2模板引擎</span></p>
<p><span style="font-size: 15px">十二、自定义404等错误的响应</span></p>
<p><span style="font-size: 15px">十三、用户会话</span></p>
<p><span style="font-size: 15px">十四、使用Cookie</span></p>
<p><span style="font-size: 15px">十五、闪存系统 flashing system</span></p>
<p> </p>
<p><span style="font-size: 18pt"></span><strong><span style="font-size: 18pt">一、简介</span></strong></p>
<p> 1、Flask 是一个轻量级的基于 Python 的 Web 框架,支持 Python 2 和 Python 3,简单易用,适合快速开发。封装功能不及Django完善,性能不及Tornado,但是Flask的第三方开源组件比丰富(<span class="s1">http://flask.pocoo.org/extensions/</span>),其 WSGI工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。</p>
<p>本文章中的代码使用 Python 3 运行,建议安装最新版本,本文使用的是<code>Python 3.6.4</code>。</p>
<p>2、其他web框架</p>
<p>(1)Django:比较“重”的框架,同时也是最出名的Python框架。包含了web开发中常用的功能、组件的框架(ORM、Session、Form、Admin、分页、中间件、信号、缓存、ContenType....),Django是走大而全的方向,最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。</p>
<p>(2)Tornado:大特性就是异步非阻塞、原生支持WebSocket协议;</p>
<p>(3)Flask:如上</p>
<p>(4)Bottle:是一个简单高效的遵循WSGI的微型python Web框架。说微型,是因为它只有一个文件,除Python标准库外,它不依赖于任何第三方模块。</p>
<p> </p>
<hr>
<p> </p>
<p></p>
<p><strong><span style="font-size: 18pt"> 二、安装</span></strong></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> pip3 <span style="color: rgba(0, 0, 255, 1)">install</span> Flask</pre>
</div>
<p>进入python交互模式看下Flask的介绍和版本:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">$ python3
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> >>><span style="color: rgba(0, 0, 0, 1)"> import flask
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> >>><span style="color: rgba(0, 0, 0, 1)"> print(flask.__doc__)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)"> flask
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> ~~~~~
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> A microframework based on Werkzeug.It<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s extensively documented</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)"> and follows best practice patterns.
</span><span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> :copyright: © <span style="color: rgba(128, 0, 128, 1)">2010</span><span style="color: rgba(0, 0, 0, 1)"> by the Pallets team.
</span><span style="color: rgba(0, 128, 128, 1)">13</span> :license: BSD, see LICENSE <span style="color: rgba(0, 0, 255, 1)">for</span> <span style="color: rgba(0, 0, 255, 1)">more</span><span style="color: rgba(0, 0, 0, 1)"> details.
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> >>><span style="color: rgba(0, 0, 0, 1)"> print(flask.__version__)
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(128, 0, 128, 1)">1.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span></pre>
</div>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p><strong><span style="font-size: 18px"><span style="font-size: 18pt"></span></span></strong></p>
<p><strong><span style="font-size: 18px"><span style="font-size: 18pt">三、初始化Flask</span> </span></strong></p>
<p><span style="font-size: 18px"><span style="font-size: 15px">使用Flask写一个显示“Hello World!”的web程序,如何配置、调试Flask。</span></span></p>
<p><strong><span style="font-size: 18px"> <span style="font-size: 16px">1、输出 Hello World</span></span></strong></p>
<p><span style="font-size: 14px">(1)按照以下命令建立Flask项目:HelloWorld,后面每一个示例会多次使用到</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</span></pre>
</div>
<style>p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 0, 0, 1) }
span.s1 { color: rgba(17, 142, 255, 1) }</style>
<p class="p1"><span style="font-size: 14px">(2)static和templates目录是默认配置,其中static用来存放静态资源,例如图片、js、css文件等。templates存放模板文件。</span></p>
<p class="p1"><span style="font-size: 14px">我们的网站逻辑基本在server.py文件中,当然,也可以给这个文件起其他的名字。</span></p>
<p><span style="font-size: 14px">(3)在<code>server.py</code>中加入以下内容:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello World!</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">10</span> app.run()</pre>
</div>
<p>(4)运行server.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ python3 server.py
</span>* Running on http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">127.0.0.1:5000/</span></pre>
</div>
<p>(5)打开浏览器访问<code>http://127.0.0.1:5000/</code>,浏览页面上将出现<code>Hello World!</code>。终端里会显示下面的信息:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span> - - [<span style="color: rgba(128, 0, 128, 1)">16</span>/May/<span style="color: rgba(128, 0, 128, 1)">2014</span> <span style="color: rgba(128, 0, 128, 1)">10</span>:<span style="color: rgba(128, 0, 128, 1)">29</span>:<span style="color: rgba(128, 0, 128, 1)">08</span>] <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GET / HTTP/1.1</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 128, 1)">200</span> -</pre>
</div>
<p>(6)变量app是一个Flask实例,通过下面的方式:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)">3</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello World!</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p><span style="font-size: 15px"><span style="font-size: 14px">当客户端访问<code>/</code>时,将响应<code>hello_world()</code>函数返回的内容。</span><strong>注意,这不是返回<code>Hello World!</code>这么简单,<code>Hello World!</code>只是HTTP响应报文的实体部分,状态码等信息既可以由Flask自动处理,也可以通过编程来制定。</strong></span></p>
<p> </p>
<p><span style="font-size: 16px"><strong> 2、修改Flask的配置</strong></span></p>
<p>(1)程序名称</p>
<div class="cnblogs_code">
<pre>app = Flask(__name__)</pre>
</div>
<p>上面的代码中,python内置变量<code>__name__</code>的值是字符串<code>__main__</code> 。Flask类将这个参数作为程序名称。当然这个是可以自定义的,比如<code>app = Flask("my-app")</code>。</p>
<p>(2)静态资源、模板、参考文档</p>
<div class="cnblogs_code">
<pre>app = Flask(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">my-app</span><span style="color: rgba(128, 0, 0, 1)">"</span>, static_folder=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">path1</span><span style="color: rgba(128, 0, 0, 1)">"</span>, template_folder=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">path2</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p> 更多参数请参考<code>__doc__</code>:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask
</span><span style="color: rgba(0, 128, 128, 1)">2</span> print(Flask.__doc__)</pre>
</div>
<p>(3)调试模式</p>
<p>上面的server.py中以<code>app.run()</code>方式运行,这种方式下,如果服务器端出现错误是不会在客户端显示的。但是在开发环境中,显示错误信息是很有必要的,要显示错误信息,应该以下面的方式运行Flask:</p>
<div class="cnblogs_code">
<pre>app.run(debug=True)</pre>
</div>
<p><span style="font-size: 15px"><strong>将<code>debug</code>设置为<code>True</code>的另一个好处是,程序启动后,会自动检测源码是否发生变化,若有变化则自动重启程序。这可以帮我们省下很多时间。</strong></span></p>
<p> (4)绑定IP和端口</p>
<p>默认情况下,Flask绑定IP为<code>127.0.0.1</code>,端口为<code>5000</code>。我们也可以通过下面的方式自定义:</p>
<div class="cnblogs_code">
<pre>app.run(host=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0.0.0.0</span><span style="color: rgba(128, 0, 0, 1)">'</span>, port=<span style="color: rgba(128, 0, 128, 1)">80</span>, debug=True)</pre>
</div>
<p><code>0.0.0.0</code>代表电脑所有的IP。<code>80</code>是HTTP网站服务的默认端口。</p>
<p><span style="font-size: 15px"><strong>由于绑定了80端口,需要使用root权限运行<code>server.py(会报错)</code>。也就是:</strong></span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> python3 server.py</pre>
</div>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p></p>
<p><strong><span style="font-size: 18px"><span style="font-size: 18pt"> 四、获取URL参数 (GET请求)</span> </span></strong></p>
<p><span style="font-size: 18px"><span style="font-size: 14px">URL参数是出现在url中的键值对,例如<code>http://127.0.0.1:5000/?disp=3</code>中的url参数是<code>{'disp':3}</code><br></span></span></p>
<p><strong><span style="font-size: 16px">1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 15px">2、列出所有的url参数</span></strong></p>
<p>(1)修改server.py 内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)"> return request.args.__str__()
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">12</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>(2)运行看效果,在浏览器中访问<code>http://127.0.0.1:5000/?user=Flask&time&p=7&p=8</code>,将显示:</p>
<div class="cnblogs_code">
<pre>ImmutableMultiDict([(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Flask</span><span style="color: rgba(128, 0, 0, 1)">'</span>), (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">time</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span>), (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">7</span><span style="color: rgba(128, 0, 0, 1)">'</span>), (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">8</span><span style="color: rgba(128, 0, 0, 1)">'</span>)])</pre>
</div>
<p>较新的浏览器也支持直接在url中输入中文(最新的火狐浏览器内部会帮忙将中文转换成符合URL规范的数据),在浏览器中访问<code>http://127.0.0.1:5000/?info=这是爱,</code>,将显示:</p>
<div class="cnblogs_code">
<pre>ImmutableMultiDict([(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">这是爱,</span><span style="color: rgba(128, 0, 0, 1)">'</span>)])</pre>
</div>
<p>(3)获取浏览器传给Flask服务的数据。可以通过<code>request.full_path</code>和<code>request.path</code>来看一下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.path)
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.full_path)
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)"> return request.args.__str__()
</span><span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">14</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>浏览器访问<code>http://127.0.0.1:5000/?info=这是爱,</code>,运行<code>server.py</code>的终端会输出:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> /
<span style="color: rgba(0, 128, 128, 1)">2</span> /?<span style="color: rgba(0, 0, 255, 1)">info</span>=%E8%BF%<span style="color: rgba(128, 0, 128, 1)">99</span>%E6%<span style="color: rgba(128, 0, 128, 1)">98</span>%AF%E7%<span style="color: rgba(128, 0, 128, 1)">88</span>%B1%EF%BC%8C</pre>
</div>
<p><strong><span style="font-size: 15px">3、获取某个指定的参数</span></strong></p>
<p>(1)获取指定参数。 例如,要获取键<code>info</code>对应的值,如下修改<code>server.py</code>:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> return request.args.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">10</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>)</pre>
</div>
<p> 运行<code>server.py</code>,在浏览器中访问<code>http://127.0.0.1:5000/?info=hello</code>,浏览器将显示:</p>
<div class="cnblogs_code">
<pre>hello</pre>
</div>
<p>(2)异常和错误。当我们访问<code>http://127.0.0.1:5000/</code>时候却出现了500错误,浏览器显示:</p>
<p><img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514100102279-661010826.jpg"> </p>
<p> 如果开启了Debug模式,会显示:</p>
<p><img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514100318028-1011456740.jpg"></p>
<p> </p>
<p>这是因为没有在URL参数中找到<code>info</code>。所以<code>request.args.get('info')</code>返回Python内置的None,而<span style="font-size: 15px"><strong>Flask不允许返回None</strong></span>。</p>
<p>解决方法很简单,先判断下它是不是None: </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> r = request.args.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">if</span> r==<span style="color: rgba(0, 0, 0, 1)">None:
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> # <span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)"> something
</span><span style="color: rgba(0, 128, 128, 1)">10</span> return <span style="color: rgba(128, 0, 0, 1)">''</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> return r
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">14</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>另外一个方法是,设置默认值,也就是取不到数据时用这个值:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
app </span>=<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
@app.route(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
def hello_world():
r </span>= request.args.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hi</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
return r
</span><span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
app.run(port</span>=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> </p>
<pre name="code" class="has"><span style="font-size: 16px"><strong>4、如何处理多值</strong></span></pre>
<p> (1)出现多值。例如, <code>http://127.0.0.1:5000/?user=Flask&time&p=7&p=8</code>,仔细看下,<code>p</code>有两个值。</p>
<p> 如果我们的代码是如下,则在浏览器中请求时,我们只会看到<code>7:</code></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> r = request.args.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)"> return r
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">11</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> (2)使用getlist 来获取多值 ,浏览器输入 <code>http://127.0.0.1:5000/?user=Flask&time&p=7&p=8</code>,我们会看到<code>['7', '8'] :</code> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> r = request.args.getlist(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)# 返回一个list
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"> return str(r)
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">13</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p> </p>
<p><span style="font-size: 18pt"><strong>五、获取POST方法传送的数据</strong></span></p>
<p>作为一种HTTP请求方法,POST用于向指定的资源提交要被处理的数据。我们在某网站注册用户、写文章等时候,需要将数据传递到网站服务器中。并不适合将数据放到URL参数中,密码放到URL参数中容易被看到,文章数据又太多,浏览器不一定支持太长长度的URL。这时,一般使用POST方法。</p>
<p><strong><span style="font-size: 16px">1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p>这里使用浏览器模拟工具:requests库</p>
<div class="cnblogs_code">
<pre>$ sudo pip3 install requests</pre>
</div>
<p><strong><span style="font-size: 16px">2、查看POST数据内容</span></strong></p>
<p>(1)编写server.py </p>
<p>以用户注册为例子,我们需要向服务器<code>/register</code>传送用户名<code>name</code>和密码<code>password</code>。如下编写<code>HelloWorld/server.py:</code></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/register</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def register():
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.headers)
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.stream.read())
</span><span style="color: rgba(0, 128, 128, 1)">15</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">welcome</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">19</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>@app.route(‘/register’, methods=[‘POST’])<code>是指url</code>/register<code>只接受POST方法。可以根据需要修改</code>methods`参数,例如如果想要让它同时支持GET和POST,这样写:</p>
<div class="cnblogs_code">
<pre>@app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/register</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span>]) </pre>
</div>
<p>(2)浏览器模拟工具client.py内容如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">import requests
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> user_info = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">password</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">123</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">4</span> r = requests.post(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:5000/register</span><span style="color: rgba(128, 0, 0, 1)">"</span>, data=<span style="color: rgba(0, 0, 0, 1)">user_info)
</span><span style="color: rgba(0, 128, 128, 1)">5</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> print(r.text)</pre>
</div>
<p>(3)运行<code>HelloWorld/server.py</code>,然后运行<code>client.py</code></p>
<p> client.py将输出:</p>
<div class="cnblogs_code">
<pre>welcome</pre>
</div>
<p> 而<code>HelloWorld/server.py</code>在终端中输出以下调试信息(通过<code>print</code>输出):</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> Host: <span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span>:<span style="color: rgba(128, 0, 128, 1)">5000</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> User-Agent: python-requests/<span style="color: rgba(128, 0, 128, 1)">2.19</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> Accept-Encoding: <span style="color: rgba(0, 0, 255, 1)">gzip</span><span style="color: rgba(0, 0, 0, 1)">, deflate
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> Accept: *<span style="color: rgba(0, 128, 0, 1)">/*</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 128, 0, 1)">Connection: keep-alive
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 128, 0, 1)">Content-Length: 24
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 128, 0, 1)">Content-Type: application/x-www-form-urlencoded
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 128, 0, 1)">b'name=letian&password=123'</span></pre>
</div>
<p> 前7行是client.py生成的HTTP请求头,由<code>print(request.headers)</code>输出。</p>
<p> 请求体的数据,我们通过<code>print(request.stream.read())</code>输出,结果是:</p>
<div class="cnblogs_code">
<pre>b<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name=letian&password=123</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">3、解析POST数据</span></strong></p>
<p>(1)修改server.py</p>
<p> <span style="color: rgba(0, 0, 0, 1)">上面,我们看到post的数据内容是:<span style="color: rgba(153, 51, 0, 1)">b</span></span><span class="hljs-string"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(153, 51, 0, 1)">'name=letian&password=123'</span>,我们要把name、password提取出来,使用Flask内置的解析器<code>request.form:</code></span><br></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/register</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">def register():
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.headers)
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> # print(request.stream.read()) # 不要用,否则下面的form取不到数据
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.form)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> print(request.form[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">16</span> print(request.form.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">17</span> print(request.form.getlist(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">18</span> print(request.form.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">nickname</span><span style="color: rgba(128, 0, 0, 1)">'</span>, default=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">little apple</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">19</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">welcome</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">23</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p><code>request.form</code>会自动解析数据。<code>request.form['name']</code>和<code>request.form.get('name')</code>都可以获取<code>name</code>对应的值。对于<code>request.form.get()</code>可以为参数<code>default</code>指定值以作为默认值。</p>
<p>(2)客户端效果 ,执行<code>client.py</code>请求数据,服务器代码会在终端输出:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> Host: <span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span>:<span style="color: rgba(128, 0, 128, 1)">5000</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> User-Agent: python-requests/<span style="color: rgba(128, 0, 128, 1)">2.19</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> Accept-Encoding: <span style="color: rgba(0, 0, 255, 1)">gzip</span><span style="color: rgba(0, 0, 0, 1)">, deflate
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> Accept: *<span style="color: rgba(0, 128, 0, 1)">/*</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 128, 0, 1)">Connection: keep-alive
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 128, 0, 1)">Content-Length: 24
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 128, 0, 1)">Content-Type: application/x-www-form-urlencoded
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 128, 0, 1)">ImmutableMultiDict([('name', 'letian'), ('password', '123')])
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 128, 0, 1)">letian
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 128, 0, 1)">letian
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 128, 0, 1)">['letian']
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 128, 0, 1)">little apple</span></pre>
</div>
<p>(3)多个值的情况。如果<code>name</code>有多个值,可以使用<code>request.form.getlist('name')</code>,该方法将返回一个列表。将client.py改一下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">import requests
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> user_info = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian2</span><span style="color: rgba(128, 0, 0, 1)">'</span>], <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">password</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">123</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">4</span> r = requests.post(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:5000/register</span><span style="color: rgba(128, 0, 0, 1)">"</span>, data=<span style="color: rgba(0, 0, 0, 1)">user_info)
</span><span style="color: rgba(0, 128, 128, 1)">5</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> print(r.text)</pre>
</div>
<p> 此时运行<code>client.py</code>,<code>print(request.form.getlist('name'))</code>将输出:</p>
<div class="cnblogs_code">
<pre></pre>
</div>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p></p>
<p><span style="font-size: 18pt"><strong> 六、处理和响应JSON数据</strong></span></p>
<p> 使用 HTTP POST 方法传到网站服务器的数据格式可以有很多种,比如“获取POST方法传送的数据”讲到的<code>name=letian&password=123</code>这种用过<code>&</code>符号分割的key-value键值对格式。我们也可以用JSON格式、XML格式。相比XML的重量、规范繁琐,JSON显得非常小巧和易用。</p>
<p><strong><span style="font-size: 16px"> 1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 16px">2、处理JSON格式的请求数据</span></strong>。如果POST的数据是JSON格式,<strong><code>request.json</code></strong>会自动将json数据转换成Python类型(字典或者列表)。</p>
<p> (1)编写server.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app = Flask(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">my-app</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello World!</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/add</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def add():
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.headers)
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> print(type(request.json))
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)"> print(request.json)
</span><span style="color: rgba(0, 128, 128, 1)">16</span> result = request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>] + request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)"> return str(result)
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">21</span> app.run(host=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>(2)编写client.py模拟浏览器请求:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">import requests
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> json_data = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> r = requests.post(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:5000/add</span><span style="color: rgba(128, 0, 0, 1)">"</span>, json=<span style="color: rgba(0, 0, 0, 1)">json_data)
</span><span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> print(r.text)</pre>
</div>
<p>(3)执行效果,运行<code>server.py</code>,然后运行<code>client.py</code></p>
<p><code>client.py</code> 会在终端输出:3</p>
<p><code>server.py</code> 会在终端输出:(<span style="font-size: 15px"><strong>注意,请求头中<code>Content-Type</code>的值是</strong></span><code><span style="font-size: 15px"><strong>application/json)</strong></span></code></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> Host: <span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span>:<span style="color: rgba(128, 0, 128, 1)">5000</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> User-Agent: python-requests/<span style="color: rgba(128, 0, 128, 1)">2.19</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> Accept-Encoding: <span style="color: rgba(0, 0, 255, 1)">gzip</span><span style="color: rgba(0, 0, 0, 1)">, deflate
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> Accept: *<span style="color: rgba(0, 128, 0, 1)">/*</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 128, 0, 1)">Connection: keep-alive
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 128, 0, 1)">Content-Length: 16
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 128, 0, 1)">Content-Type: application/json
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 128, 0, 1)"><class 'dict'>
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 128, 0, 1)">{'a': 1, 'b': 2}</span></pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">3、响应JSON - 方案1 :json.dumps()</span></strong></p>
<p><strong> </strong>响应JSON时,除了要把响应体改成JSON格式,响应头的<code>Content-Type</code>也要设置为<code>application/json</code>。</p>
<p>(1)编写server2.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request, Response
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">import json
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> app = Flask(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">my-app</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello World!</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/add</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">def add():
</span><span style="color: rgba(0, 128, 128, 1)">14</span> result = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sum</span><span style="color: rgba(128, 0, 0, 1)">'</span>: request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>] + request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]}
</span><span style="color: rgba(0, 128, 128, 1)">15</span> return Response(json.dumps(result),mimetype=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">application/json</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">19</span> app.run(host=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>(2)编写client2.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">import requests
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> json_data = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> r = requests.post(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:5000/add</span><span style="color: rgba(128, 0, 0, 1)">"</span>, json=<span style="color: rgba(0, 0, 0, 1)">json_data)
</span><span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">print(r.headers)
</span><span style="color: rgba(0, 128, 128, 1)">8</span> print(r.text)</pre>
</div>
<p>(3)执行效果</p>
<p> 运行<code>client.py</code>,将显示:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Content-Type</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">application/json</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Content-Length</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">10</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Server</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Werkzeug/0.14.1 Python/3.6.4</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Date</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Sat, 07 Jul 2018 05:23:00 GMT</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">2</span> {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sum</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">3</span>}</pre>
</div>
<p> 上面第一段内容是服务器的响应头,第二段内容是响应体,也就是服务器返回的JSON格式数据。</p>
<p>(4)定制HTTP响应头,比如自定义<code>Server</code>,可以如下修改<code>add()</code>函数:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/add</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">def add():
</span><span style="color: rgba(0, 128, 128, 1)">3</span> result = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sum</span><span style="color: rgba(128, 0, 0, 1)">'</span>: request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>] + request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]}
</span><span style="color: rgba(0, 128, 128, 1)">4</span> resp = Response(json.dumps(result),mimetype=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">application/json</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">5</span> resp.headers.add(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Server</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">python flask</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">6</span> return resp</pre>
</div>
<p><code> client2.py</code>运行后会输出:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Content-Type</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">application/json</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Content-Length</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">10</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Server</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">python flask</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Date</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Sat, 07 Jul 2018 05:26:40 GMT</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">2</span> {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sum</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">3</span>}</pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">4、响应JSON - 方案2:使用 jsonify 工具函数</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request, jsonify
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app = Flask(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">my-app</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello World!</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/add</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def add():
</span><span style="color: rgba(0, 128, 128, 1)">13</span> result = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sum</span><span style="color: rgba(128, 0, 0, 1)">'</span>: request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>] + request.json[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]}
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> return jsonify(result)
</span><span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">18</span> app.run(host=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p> </p>
<p><span style="font-size: 18pt"><strong>七、上传文件</strong></span></p>
<p>一般也是POST方法</p>
<p> <strong><span style="font-size: 16px">1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">2、上传文件</span></strong></p>
<p>以上传图片为例:假设将上传的图片只允许’png’、’jpg’、’jpeg’、’gif’这四种格式,通过url<code>/upload</code>使用POST上传,上传的图片存放在服务器端的<code>static/uploads</code>目录下。</p>
<p>(1)首先在项目<code>HelloWorld</code>中创建目录<code>static/uploads</code>:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/static/uploads</pre>
</div>
<p>(2)使用werkzeug库,判断文件名是否安全,例如防止文件名是<code>../../../a.png:</code></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> pip3 <span style="color: rgba(0, 0, 255, 1)">install</span> werkzeug</pre>
</div>
<p>(3)编写server.py:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">from werkzeug.utils import secure_filename
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">import os
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)"># 文件上传目录
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> app.config[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UPLOAD_FOLDER</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">static/uploads/</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)"># 支持的文件格式
</span><span style="color: rgba(0, 128, 128, 1)">11</span> app.config[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ALLOWED_EXTENSIONS</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">jpg</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">jpeg</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gif</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">}# 集合类型
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"># 判断文件名是否是我们支持的格式
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">def allowed_file(filename):
</span><span style="color: rgba(0, 128, 128, 1)">16</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> filename and \
</span><span style="color: rgba(0, 128, 128, 1)">17</span> filename.rsplit(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>)[<span style="color: rgba(128, 0, 128, 1)">1</span>] <span style="color: rgba(0, 0, 255, 1)">in</span> app.config[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ALLOWED_EXTENSIONS</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)">22</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/upload</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">def upload():
</span><span style="color: rgba(0, 128, 128, 1)">27</span> upload_file = request.files[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">image</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> upload_file and allowed_file(upload_file.filename):
</span><span style="color: rgba(0, 128, 128, 1)">29</span> filename =<span style="color: rgba(0, 0, 0, 1)"> secure_filename(upload_file.filename)
</span><span style="color: rgba(0, 128, 128, 1)">30</span> # 将文件保存到 static/<span style="color: rgba(0, 0, 0, 1)">uploads 目录,文件名同上传时使用的文件名
</span><span style="color: rgba(0, 128, 128, 1)">31</span> upload_file.save(os.path.<span style="color: rgba(0, 0, 255, 1)">join</span>(app.root_path, app.config[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UPLOAD_FOLDER</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">], filename))
</span><span style="color: rgba(0, 128, 128, 1)">32</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">info is </span><span style="color: rgba(128, 0, 0, 1)">'</span>+request.form.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span>)+<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">. success</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">34</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">failed</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">35</span>
<span style="color: rgba(0, 128, 128, 1)">36</span>
<span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">38</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p><code> 解析: </code></p>
<p><code> <1> app.config</code>中的config是字典的子类,可以用来设置自有的配置信息,也可以设置自己的配置信息。</p>
<p> <2> 函数<code>allowed_file(filename)</code>用来判断<code>filename</code>是否有后缀以及后缀是否在<code>app.config['ALLOWED_EXTENSIONS']</code>中。</p>
<p> <3> 客户端上传的图片必须以<code>image</code>标识。</p>
<p><code> <4> upload_file</code>是上传文件对应的对象。</p>
<p><code> <5> app.root_path</code>获取<code>server.py</code>所在目录在文件系统中的绝对路径。</p>
<p><code> <6> upload_file.save(path)</code>用来将<code>upload_file</code>保存在服务器的文件系统中,参数最好是绝对路径,否则会报错(网上很多代码都是使用相对路径,但是笔者在使用相对路径时总是报错,说找不到路径)。</p>
<p> <7> 函数<code>os.path.join()</code>用来将使用合适的路径分隔符将路径组合起来。</p>
<p> </p>
<p>(4)定制客户端client.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">import requests
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> file_data = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">image</span><span style="color: rgba(128, 0, 0, 1)">'</span>: open(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Lenna.jpg</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">rb</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)}
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> user_info = {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Lenna</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> r = requests.post(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:5000/upload</span><span style="color: rgba(128, 0, 0, 1)">"</span>, data=user_info, files=<span style="color: rgba(0, 0, 0, 1)">file_data)
</span><span style="color: rgba(0, 128, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)">9</span> print(r.text)</pre>
</div>
<p>(5)执行效果。</p>
<p> <1> 运行<code>client.py</code>,当前目录下的<code>Lenna.jpg</code>将上传到服务器。然后,我们可以在<code>static/uploads</code>中看到文件<code>Lenna.jpg</code>。</p>
<p> <2> 要控制上产文件的大小,可以设置请求实体的大小,例如:(不过,在处理上传文件时候,需要使用<code>try:...except:...</code>)</p>
<div class="cnblogs_code">
<pre>app.config[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MAX_CONTENT_LENGTH</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 128, 1)">16</span> * <span style="color: rgba(128, 0, 128, 1)">1024</span> * <span style="color: rgba(128, 0, 128, 1)">1024</span> #16MB</pre>
</div>
<p> <3> 获取上传文件的内容可以:</p>
<div class="cnblogs_code">
<pre>file_content = request.files[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">image</span><span style="color: rgba(128, 0, 0, 1)">'</span>].stream.read()</pre>
</div>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p><strong><span style="font-size: 18px"></span></strong></p>
<p><span style="font-size: 18pt"><strong>八、Restful URL</strong></span> </p>
<p>简单来说,Restful URL可以看做是对 URL 参数的替代</p>
<p>推荐阅读:阮一峰 理解RESTful架构 http://www.ruanyifeng.com/blog/2011/09/restful.html</p>
<p><strong><span style="font-size: 16px">1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 16px">2、写代码</span></strong></p>
<p>(1)编写server.py:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/user/<username></span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def user(username):
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> print(username)
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> print(type(username))
</span><span style="color: rgba(0, 128, 128, 1)">15</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> username
</span><span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/user/<username>/friends</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">def user_friends(username):
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)"> print(username)
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)"> print(type(username))
</span><span style="color: rgba(0, 128, 128, 1)">22</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> username + 'They are your friends.'
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">26</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> </p>
<p>(2)执行。运行<code>HelloWorld/server.py</code>。</p>
<p> <1> 使用浏览器访问<code>http://127.0.0.1:5000/user/letian</code>,HelloWorld/server.py将输出:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">letian
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <class <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">str</span><span style="color: rgba(128, 0, 0, 1)">'</span>></pre>
</div>
<p> <2> 访问<code>http://127.0.0.1:5000/user/letian/</code>,响应为404 Not Found</p>
<p> <3> 浏览器访问<code>http://127.0.0.1:5000/user/letian/friends</code>,可以看到:</p>
<div class="cnblogs_code">
<pre>Hello letian. They are your friends.</pre>
</div>
<p><code> HelloWorld/server.py</code>输出:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">letian
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <class <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">str</span><span style="color: rgba(128, 0, 0, 1)">'</span>></pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">3、转换类型</span></strong></p>
<p>由上面的示例可以看出,使用 Restful URL 得到的变量默认为str对象。如果我们需要通过分页显示查询结果,那么需要在url中有数字来指定页数。按照上面方法,可以在获取str类型页数变量后,将其转换为int类型。不过,还有更方便的方法,<span style="font-size: 15px"><strong>就是用flask内置的转换机制,即在route中指定该如何转换</strong></span>。</p>
<p>(1)修改server :@app.route(‘/page/int:num‘)`会将num变量自动转换成int类型。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/page/<int:num></span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def page(num):
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> print(num)
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> print(type(num))
</span><span style="color: rgba(0, 128, 128, 1)">15</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">19</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> </p>
<p>(2)执行。在浏览器中访问<code>http://127.0.0.1:5000/page/1</code>,HelloWorld/server.py将输出如下内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <class <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">int</span><span style="color: rgba(128, 0, 0, 1)">'</span>></pre>
</div>
<p>如果访问的是<code>http://127.0.0.1:5000/page/asd</code>,我们会得到404响应。</p>
<p> </p>
<p>(3)在官方资料中,说是有3个默认的转换器(看上去够用):</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> accepts integers
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">float</span> like <span style="color: rgba(0, 0, 255, 1)">int</span> but <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> floating point values
</span><span style="color: rgba(0, 128, 128, 1)">3</span> path like the default but also accepts slashes</pre>
</div>
<p>(4)一个特殊用法,修改server:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/page/<int:num1>-<int:num2></span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def page(num1, num2):
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> print(num1)
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> print(num2)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">19</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>在浏览器中访问<code>http://127.0.0.1:5000/page/11-22</code>,<code>HelloWorld/server.py</code>会输出:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(128, 0, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(128, 0, 128, 1)">22</span></pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">4、编写转换器(自定义)</span></strong></p>
<p>自定义的转换器是一个继承<code>werkzeug.routing.BaseConverter</code>的类,修改<code>to_python</code>和<code>to_url</code>方法即可。<code>to_python</code>方法用于将url中的变量转换后供被@app.route<code>包装的函数使用,</code>to_url<code>方法用于</code>flask.url_for中的参数转换。</p>
<p>下面是一个示例,将<code>HelloWorld/server.py</code>修改如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, url_for
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">from werkzeug.routing import BaseConverter
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">class MyIntConverter(BaseConverter):
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)"> def __init__(self, url_map):
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"> super(MyIntConverter, self).__init__(url_map)
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> def to_python(self, value):
</span><span style="color: rgba(0, 128, 128, 1)">12</span> return <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">(value)
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> def to_url(self, value):
</span><span style="color: rgba(0, 128, 128, 1)">15</span> return value * <span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)">19</span> app.url_map.converters[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">my_int</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> MyIntConverter
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)">24</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">25</span>
<span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/page/<my_int:num></span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)">def page(num):
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)"> print(num)
</span><span style="color: rgba(0, 128, 128, 1)">30</span> print(url_for(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">page</span><span style="color: rgba(128, 0, 0, 1)">'</span>, num=<span style="color: rgba(128, 0, 128, 1)">123</span>)) # page 对应的是 page函数 ,num 对应对应`/page/<my_int:num><span style="color: rgba(0, 0, 0, 1)">`中的num,必须是str
</span><span style="color: rgba(0, 128, 128, 1)">31</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">32</span>
<span style="color: rgba(0, 128, 128, 1)">33</span>
<span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">35</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>浏览器访问<code>http://127.0.0.1:5000/page/123</code>后,<code>HelloWorld/server.py</code>的输出信息是:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(128, 0, 128, 1)">123</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> /page/<span style="color: rgba(128, 0, 128, 1)">123123</span></pre>
</div>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p><strong><span style="font-size: 18px"></span></strong></p>
<p><strong><span style="font-size: 18px"> 九、使用url_for生成链接 </span></strong> </p>
<p>工具函数<code>url_for</code>可以让你以软编码的形式生成url,提供开发效率</p>
<p><strong><span style="font-size: 16px"> 1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 16px">2、写代码</span></strong></p>
<p>(1)编写server.py:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, url_for
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)"> pass
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/user/<name></span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">def user(name):
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> pass
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/page/<int:num></span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">def page(num):
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)"> pass
</span><span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">def test():
</span><span style="color: rgba(0, 128, 128, 1)">19</span> print(url_for(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello_world</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">20</span> print(url_for(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user</span><span style="color: rgba(128, 0, 0, 1)">'</span>, name=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">21</span> print(url_for(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">page</span><span style="color: rgba(128, 0, 0, 1)">'</span>, num=<span style="color: rgba(128, 0, 128, 1)">1</span>, q=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hadoop mapreduce 10%3</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">22</span> print(url_for(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">static</span><span style="color: rgba(128, 0, 0, 1)">'</span>, filename=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">uploads/01.jpg</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">23</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">26</span> app.run(debug=True)</pre>
</div>
<p>(2)执行结果。运行<code>HelloWorld/server.py,</code>然后在浏览器中访问<code>http://127.0.0.1:5000/test</code>,<code>HelloWorld/server.py</code>将输出以下信息:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> /
<span style="color: rgba(0, 128, 128, 1)">2</span> /user/<span style="color: rgba(0, 0, 0, 1)">letian
</span><span style="color: rgba(0, 128, 128, 1)">3</span> /page/<span style="color: rgba(128, 0, 128, 1)">1</span>?q=hadoop+mapreduce+<span style="color: rgba(128, 0, 128, 1)">10</span>%<span style="color: rgba(128, 0, 128, 1)">253</span>
<span style="color: rgba(0, 128, 128, 1)">4</span> /static/uploads/<span style="color: rgba(128, 0, 128, 1)">01</span>.jpg</pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p><strong><span style="font-size: 18px"></span></strong></p>
<p><span style="font-size: 18pt"><strong>十、使用redirect重定向网址</strong></span></p>
<p><code>redirect</code>函数用于重定向,实现机制很简单,就是向客户端(浏览器)发送一个重定向的HTTP报文,浏览器会去访问报文中指定的url。</p>
<p><strong><span style="font-size: 16px">1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 16px">2、编写代码。</span></strong>使用<code>redirect</code>时,给它一个字符串类型的参数就行了。</p>
<p>(1)编写server</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, url_for, redirect
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">def test1():
</span><span style="color: rgba(0, 128, 128, 1)">11</span> print(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">this is test1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span> return redirect(url_for(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">test2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">def test2():
</span><span style="color: rgba(0, 128, 128, 1)">16</span> print(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">this is test2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">17</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">this is test2</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">20</span> app.run(debug=True)</pre>
</div>
<p>(2)运行<code>HelloWorld/server.py</code>,在浏览器中访问<code>http://127.0.0.1:5000/test1</code>,浏览器的url会变成<code>http://127.0.0.1:5000/test2</code>,并显示:</p>
<div class="cnblogs_code">
<pre>this is test2</pre>
</div>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p> </p>
<p><span style="font-size: 18pt"><strong>十一、使用Jinja2模板引擎</strong></span></p>
<p>模板引擎负责MVC中的V(view,视图)这一部分。Flask默认使用Jinja2模板引擎。</p>
<p>Flask与模板相关的函数有:</p>
<ul>
<li>flask.render_template(template_name_or_list, **context)<br>Renders a template from the template folder with the given context.</li>
<li>flask.render_template_string(source, **context)<br>Renders a template from the given template source string with the given context.</li>
<li>flask.get_template_attribute(template_name, attribute)<br>Loads a macro (or variable) a template exports. This can be used to invoke a macro from within Python code.</li>
</ul>
<p>这其中常用的就是前两个函数。本例中使用了模板继承、if判断、for循环。</p>
<p><strong><span style="font-size: 16px"> 1、同上,创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 16px">2、创建并编辑 HelloWorld/templates/default.html</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <html>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <head>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <title>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> {% <span style="color: rgba(0, 0, 255, 1)">if</span> page_title %<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)"> {{ page_title }}
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> {% endif %<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> </title>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> </head>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <body>
<span style="color: rgba(0, 128, 128, 1)">11</span> {% block body %}{% endblock %<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">```
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">可以看到,在``标签中使用了if判断,如果给模板传递了`page_title`变量,显示之,否则,不显示。
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">``标签中定义了一个名为`body`的block,用来被其他模板文件继承。
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">## 11.3 创建并编辑HelloWorld/templates/user_info.html</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">内容如下:
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">```
</span><span style="color: rgba(0, 128, 128, 1)">20</span> {% extends <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">default.html</span><span style="color: rgba(128, 0, 0, 1)">"</span> %<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> {% block body %<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">23</span> {% <span style="color: rgba(0, 0, 255, 1)">for</span> key <span style="color: rgba(0, 0, 255, 1)">in</span> user_info %<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)"> {{ key }}: {{ user_info }}
</span><span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span>
<span style="color: rgba(0, 128, 128, 1)">28</span> {% endfor %<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">29</span> {% endblock %}</pre>
</div>
<p> 变量<code>user_info</code>应该是一个字典,for循环用来循环输出键值对。</p>
<p> </p>
<p><strong><span style="font-size: 16px">3、编辑 server.py</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">from</span> flask <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> Flask, render_template
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app = Flask(<span style="color: rgba(128, 0, 128, 1)">__name__</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/user</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> user():
</span><span style="color: rgba(0, 128, 128, 1)">13</span> user_info =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">email</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">123@aa.com</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:0,
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">github</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">https://github.com/letiantian</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">return</span> render_template(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_info.html</span><span style="color: rgba(128, 0, 0, 1)">'</span>, page_title=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian\'s info</span><span style="color: rgba(128, 0, 0, 1)">'</span>, user_info=<span style="color: rgba(0, 0, 0, 1)">user_info)
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">23</span> app.run(port=5000, debug=True)</pre>
</div>
<p><code> render_template()</code>函数的第一个参数指定模板文件,后面的参数是要传递的数据。</p>
<p> </p>
<p><strong><span style="font-size: 16px">4、运行与测试</span></strong></p>
<p>运行HelloWorld/server.py,在浏览器中访问<code>http://127.0.0.1:5000/user</code>,效果图如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514134355912-196762977.png"></p>
<p> </p>
<p> 查看网页源码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)"> letian&#39;s info
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> name: letian <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> email: 123@aa.com <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 128, 128, 1)">10</span> age: 0 <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 128, 128, 1)">11</span> github: https://github.com/letiantian <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p></p>
<p><span style="font-size: 18pt"><strong> 十二、自定义404等错误的响应</strong></span></p>
<p> 要处理HTTP错误,可以使用<code>flask.abort</code>函数。</p>
<p><strong><span style="font-size: 16px">1、示例1:简单入门</span></strong></p>
<p>(1)创建项目</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">mkdir HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">mkdir HelloWorld/static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">mkdir HelloWorld/templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> touch HelloWorld/server.py</pre>
</div>
<p>(2)编辑 server.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, render_template_string, abort
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/user</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def user():
</span><span style="color: rgba(0, 128, 128, 1)">13</span> abort(<span style="color: rgba(128, 0, 128, 1)">401</span><span style="color: rgba(0, 0, 0, 1)">)# Unauthorized 未授权
</span><span style="color: rgba(0, 128, 128, 1)">14</span> print(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Unauthorized, 请先登录</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">18</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> </p>
<p>(3)效果。运行<code>HelloWorld/server.py</code>,浏览器访问<code>http://127.0.0.1:5000/user</code>,效果如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514134710365-712959326.jpg"></p>
<p><span style="font-size: 15px"><strong>要注意的是,<code>HelloWorld/server.py</code>中<code>abort(401)</code>后的<code>print</code>并没有执行。</strong></span></p>
<p> </p>
<p><strong><span style="font-size: 16px">2、示例2 :自定义错误页面</span></strong></p>
<p>(1)修改server</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, render_template_string, abort
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/user</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">def user():
</span><span style="color: rgba(0, 128, 128, 1)">13</span> abort(<span style="color: rgba(128, 0, 128, 1)">401</span><span style="color: rgba(0, 0, 0, 1)">)# Unauthorized
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> @app.errorhandler(<span style="color: rgba(128, 0, 128, 1)">401</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">def page_unauthorized(error):
</span><span style="color: rgba(0, 128, 128, 1)">18</span> return render_template_string(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)"><h1> Unauthorized </h1><h2>{{ error_info }}</h2></span><span style="color: rgba(128, 0, 0, 1)">'</span>, error_info=error), <span style="color: rgba(128, 0, 128, 1)">401</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>
<span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">22</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p><code>page_unauthorized</code>函数返回的是一个元组,401 代表HTTP 响应状态码。如果省略401,则响应状态码会变成默认的 200。</p>
<p> </p>
<p> (2)效果,运行<code>HelloWorld/server.py</code>,浏览器访问<code>http://127.0.0.1:5000/user</code>,效果如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514135103958-204863105.jpg"></p>
<p> </p>
<hr>
<p> </p>
<p> </p>
<p><strong><span style="font-size: 18px"><span style="font-size: 18pt">十三、用户会话 </span> </span></strong></p>
<p><span style="font-size: 15px">session用来记录用户的登录状态,一般基于cookie实现</span></p>
<p><strong><span style="font-size: 16px">1、创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 16px">2、编辑 server.py</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, render_template_string, \
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)"> session, request, redirect, url_for
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> app.secret_key = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F12Zr47j\3yX R~X@H!jLwf/T</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)">11</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> def <span style="color: rgba(0, 0, 255, 1)">login</span><span style="color: rgba(0, 0, 0, 1)">():
</span><span style="color: rgba(0, 128, 128, 1)">16</span> page = <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <form action=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{{ url_for('do_login') }}</span><span style="color: rgba(128, 0, 0, 1)">"</span> method=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">post</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<span style="color: rgba(0, 128, 128, 1)">18</span> <p>name: <input type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text</span><span style="color: rgba(128, 0, 0, 1)">"</span> name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">user_name</span><span style="color: rgba(128, 0, 0, 1)">"</span> /></p>
<span style="color: rgba(0, 128, 128, 1)">19</span> <input type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">submit</span><span style="color: rgba(128, 0, 0, 1)">"</span> value=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Submit</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
<span style="color: rgba(0, 128, 128, 1)">20</span> </form>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)"> return render_template_string(page)
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/do_login</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">def do_login():
</span><span style="color: rgba(0, 128, 128, 1)">27</span> name = request.form.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">28</span> session[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_name</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> name
</span><span style="color: rgba(0, 128, 128, 1)">29</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">success</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">30</span>
<span style="color: rgba(0, 128, 128, 1)">31</span>
<span style="color: rgba(0, 128, 128, 1)">32</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/show</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 0, 1)">def show():
</span><span style="color: rgba(0, 128, 128, 1)">34</span> return session[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">35</span>
<span style="color: rgba(0, 128, 128, 1)">36</span>
<span style="color: rgba(0, 128, 128, 1)">37</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/logout</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)">def logout():
</span><span style="color: rgba(0, 128, 128, 1)">39</span> session.pop(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, None)
</span><span style="color: rgba(0, 128, 128, 1)">40</span> return redirect(url_for(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">41</span>
<span style="color: rgba(0, 128, 128, 1)">42</span>
<span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">44</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>代码含义与解析:</p>
<p><code>(1)app.secret_key</code>用于给session加密。</p>
<p>(2)在<code>/login</code>中将向用户展示一个表单,要求输入一个名字,submit后将数据以post的方式传递给<code>/do_login</code>,<code>/do_login</code>将名字存放在session中。</p>
<p>(3)如果用户成功登录,访问<code>/show</code>时会显示用户的名字。此时,打开firebug等调试工具,选择session面板,会看到有一个cookie的名称为<code>session</code>。</p>
<p><code>(4)/logout</code>用于登出,通过将<code>session</code>中的<code>user_name</code>字段pop即可。Flask中的session基于字典类型实现,调用pop方法时会返回pop的键对应的值;如果要pop的键并不存在,那么返回值是<code>pop()</code>的第二个参数。</p>
<p>(5)使用<code>redirect()</code>重定向时,一定要在前面加上<code>return</code>。</p>
<p> </p>
<p><strong><span style="font-size: 16px"> 3、效果</span></strong></p>
<p>(1)进入<code>http://127.0.0.1:5000/login</code>,输入name,点击submit:</p>
<p><img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514135853859-1009663320.jpg"></p>
<p> </p>
<p>进入<code>http://127.0.0.1:5000/show</code>查看session中存储的name:</p>
<p><img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514135929592-2278905.jpg"></p>
<p> 4、设置session的有效时间,将session的有效时间设置为5分钟。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">from datetime import timedelta
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">from flask import session, app
</span><span style="color: rgba(0, 128, 128, 1)">3</span>
<span style="color: rgba(0, 128, 128, 1)">4</span> session.permanent =<span style="color: rgba(0, 0, 0, 1)"> True
</span><span style="color: rgba(0, 128, 128, 1)">5</span> app.permanent_session_lifetime = timedelta(minutes=<span style="color: rgba(128, 0, 128, 1)">5</span>)</pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p><strong><span style="font-size: 18px"></span></strong></p>
<p><span style="font-size: 18pt"><strong>十四、使用Cookie</strong></span></p>
<p>Cookie是存储在客户端的记录访问者状态的数据。 常用的用于记录用户登录状态的session大多是基于cookie实现的。cookie可以借助<strong><span style="font-size: 18px"><code>flask.Response</code></span></strong>来实现。</p>
<p>推荐阅读:具体原理 http://zh.wikipedia.org/wiki/Cookie </p>
<p><strong><span style="font-size: 16px">1、创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p><strong><span style="font-size: 16px">2、代码</span></strong></p>
<p>(1)修改server.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, request, Response, make_response
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import <span style="color: rgba(0, 0, 255, 1)">time</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">def hello_world():
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello world</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/add</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">13</span> def <span style="color: rgba(0, 0, 255, 1)">login</span><span style="color: rgba(0, 0, 0, 1)">():
</span><span style="color: rgba(0, 128, 128, 1)">14</span> res = Response(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">add cookies</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> res.set_cookie(key=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>, value=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian</span><span style="color: rgba(128, 0, 0, 1)">'</span>, expires=<span style="color: rgba(0, 0, 255, 1)">time</span>.<span style="color: rgba(0, 0, 255, 1)">time</span>()+<span style="color: rgba(128, 0, 128, 1)">6</span>*<span style="color: rgba(128, 0, 128, 1)">60</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)"> return res
</span><span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/show</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">def show():
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)"> return request.cookies.__str__()
</span><span style="color: rgba(0, 128, 128, 1)">22</span>
<span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/del</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">def del_cookie():
</span><span style="color: rgba(0, 128, 128, 1)">26</span> res = Response(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">delete cookies</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">27</span> res.set_cookie(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span>, expires=<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)"> return res
</span><span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span>
<span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">32</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>由上可以看到,可以使用<code>Response.set_cookie</code>添加和删除cookie。<code>expires</code>参数用来设置cookie有效时间,它的值可以是<code>datetime</code>对象或者unix时间戳,笔者使用的是unix时间戳。</p>
<div class="cnblogs_code">
<pre>res.set_cookie(key=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>, value=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian</span><span style="color: rgba(128, 0, 0, 1)">'</span>, expires=<span style="color: rgba(0, 0, 255, 1)">time</span>.<span style="color: rgba(0, 0, 255, 1)">time</span>()+<span style="color: rgba(128, 0, 128, 1)">6</span>*<span style="color: rgba(128, 0, 128, 1)">60</span>)</pre>
</div>
<p>上面的expire参数的值表示cookie在从现在开始的6分钟内都是有效的。</p>
<p>要删除cookie,将expire参数的值设为0即可:</p>
<div class="cnblogs_code">
<pre>res.set_cookie(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span>, expires=<span style="color: rgba(128, 0, 128, 1)">0</span>)</pre>
</div>
<p><code>set_cookie()</code>函数的原型如下:</p>
<div class="cnblogs_code">
<pre>set_cookie(key, value=’’, max_age=None, expires=None, path=’/‘, domain=None, secure=None, httponly=<span style="color: rgba(0, 0, 0, 1)">False)
Sets a cookie. The parameters are the same as </span><span style="color: rgba(0, 0, 255, 1)">in</span> the cookie Morsel <span style="color: rgba(0, 0, 255, 1)">object</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> the Python standard library but it accepts unicode data, too.
Parameters:
key – the key (name) of the cookie to be set.
value – the value of the cookie.
max_age – should be a number of seconds, or None (default) </span><span style="color: rgba(0, 0, 255, 1)">if</span> the cookie should <span style="color: rgba(0, 0, 255, 1)">last</span> only as <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> as the client’s browser session.
expires – should be a datetime </span><span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> or UNIX timestamp.
domain – </span><span style="color: rgba(0, 0, 255, 1)">if</span> you want to set a cross-domain cookie. For example, domain=<span style="color: rgba(0, 0, 0, 1)">”.example.com” will set a cookie that is readable by the domain <br> www.example.com, foo.example.com etc. Otherwise, a cookie will only be readable by the domain that set it.
path – limits the cookie to a given path, per default it will span the whole domain.</span></pre>
</div>
<p> </p>
<p>(2)运行与测试</p>
<p> <1> 运行server.py,使用浏览器打开<code>http://127.0.0.1:5000/add</code>,浏览器界面会显示:</p>
<div class="cnblogs_code">
<pre>add cookies</pre>
</div>
<p> <2> 查看cookie,如果使用firefox浏览器,可以用firebug插件查看。打开firebug,选择<code>Cookies</code>选项,刷新页面,可以看到名为<code>name</code>的cookie,其值为<code>letian</code>。</p>
<p>在“网络”选项中,可以查看响应头中类似下面内容的设置cookie的HTTP「指令」:</p>
<div class="cnblogs_code">
<pre>Set-Cookie: name=letian; Expires=Sun, <span style="color: rgba(128, 0, 128, 1)">29</span>-Jun-<span style="color: rgba(128, 0, 128, 1)">2014</span> <span style="color: rgba(128, 0, 128, 1)">05</span>:<span style="color: rgba(128, 0, 128, 1)">16</span>:<span style="color: rgba(128, 0, 128, 1)">27</span> GMT; Path=/</pre>
</div>
<p> <3> 在cookie有效期间,使用浏览器访问<code>http://127.0.0.1:5000/show</code>,可以看到: </p>
<div class="cnblogs_code">
<pre>{<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">letian</span><span style="color: rgba(128, 0, 0, 1)">'</span>}</pre>
</div>
<p> </p>
<p> </p>
<hr>
<p> </p>
<p></p>
<p><span style="font-size: 18pt"><strong>十五、闪存系统 flashing system</strong></span></p>
<p> Flask的闪存系统(flashing system)用于向用户提供反馈信息,这些反馈信息一般是对用户上一次操作的反馈。反馈信息是存储在服务器端的,当服务器向客户端返回反馈信息后,这些反馈信息会被服务器端删除。</p>
<p><strong><span style="font-size: 16px"> 1、创建项目</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">static
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> HelloWorld/<span style="color: rgba(0, 0, 0, 1)">templates
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">touch</span> HelloWorld/server.py</pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">2、编写server.py</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">from flask import Flask, flash, get_flashed_messages
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import <span style="color: rgba(0, 0, 255, 1)">time</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> app =<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> app.secret_key = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">some_secret</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">def index():
</span><span style="color: rgba(0, 128, 128, 1)">10</span> return <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hi</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/gen</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">def gen():
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 255, 1)">info</span> = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">access at </span><span style="color: rgba(128, 0, 0, 1)">'</span>+ <span style="color: rgba(0, 0, 255, 1)">time</span>.<span style="color: rgba(0, 0, 255, 1)">time</span><span style="color: rgba(0, 0, 0, 1)">().__str__()
</span><span style="color: rgba(0, 128, 128, 1)">16</span> flash(<span style="color: rgba(0, 0, 255, 1)">info</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">17</span> return <span style="color: rgba(0, 0, 255, 1)">info</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/show1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">def show1():
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)"> return get_flashed_messages().__str__()
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> @app.route(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/show2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">def show2():
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)"> return get_flashed_messages().__str__()
</span><span style="color: rgba(0, 128, 128, 1)">28</span>
<span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">31</span> app.run(port=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p> </p>
<p><strong><span style="font-size: 16px">3、效果</span></strong></p>
<p>(1)打开浏览器,访问<code>http://127.0.0.1:5000/gen</code>,浏览器界面显示(注意,时间戳是动态生成的,每次都会不一样,除非并行访问):</p>
<div class="cnblogs_code">
<pre>access at <span style="color: rgba(128, 0, 128, 1)">1404020982.83</span></pre>
</div>
<p>(2)查看浏览器的cookie,可以看到<code>session</code>,其对应的内容是:</p>
<div class="cnblogs_code">
<pre>.eJyrVopPy0kszkgtVrKKrlZSKIFQSUpWSknhYVXJRm55UYG2tkq1OlDRyHC_rKgIvypPdzcDTxdXA1-XwHLfLEdTfxfPUn8XX6DKWCAEAJKBGq8.BpE6dg.F1VURZa7VqU9bvbC4XIBO9-3Y4Y</pre>
</div>
<p>(3)再一次访问<code>http://127.0.0.1:5000/gen</code>,浏览器界面显示:</p>
<div class="cnblogs_code">
<pre>access at <span style="color: rgba(128, 0, 128, 1)">1404021130.32</span></pre>
</div>
<p>cookie中<code>session</code>发生了变化,新的内容是:</p>
<div class="cnblogs_code">
<pre>.eJyrVopPy0kszkgtVrKKrlZSKIFQSUpWSknhYVXJRm55UYG2tkq1OlDRyHC_rKgIvypPdzcDTxdXA1-XwHLfLEdTfxfPUn8XX6DKWLBaMg1yrfCtciz1rfIEGxRbCwAhGjC5.BpE7Cg.Cb_B_k2otqczhknGnpNjQ5u4dqw</pre>
</div>
<p>(4)然后使用浏览器访问<code>http://127.0.0.1:5000/show1</code>,浏览器界面显示:</p>
<div class="cnblogs_code">
<pre>[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">access at 1404020982.83</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">access at 1404021130.32</span><span style="color: rgba(128, 0, 0, 1)">'</span>]</pre>
</div>
<p> </p>
<p>这个列表中的内容也就是上面的两次访问<code>http://127.0.0.1:5000/gen</code>得到的内容。此时,cookie中已经没有<code>session</code>了。</p>
<p>如果使用浏览器访问<code>http://127.0.0.1:5000/show1</code>或者<code>http://127.0.0.1:5000/show2</code>,只会得到:[ ]</p>
<p> </p>
<p><strong><span style="font-size: 16px"> 4、高级用法</span></strong></p>
<p>flash系统也支持对flash的内容进行分类。修改<code>HelloWorld/server.py</code>内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">from flask import Flask, flash, get_flashed_messages
import </span><span style="color: rgba(0, 0, 255, 1)">time</span><span style="color: rgba(0, 0, 0, 1)">
app </span>=<span style="color: rgba(0, 0, 0, 1)"> Flask(__name__)
app.secret_key </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">some_secret</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
@app.route(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
def index():
return </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hi</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
@app.route(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/gen</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
def gen():
</span><span style="color: rgba(0, 0, 255, 1)">info</span> = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">access at </span><span style="color: rgba(128, 0, 0, 1)">'</span>+ <span style="color: rgba(0, 0, 255, 1)">time</span>.<span style="color: rgba(0, 0, 255, 1)">time</span><span style="color: rgba(0, 0, 0, 1)">().__str__()
flash(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">show1 </span><span style="color: rgba(128, 0, 0, 1)">'</span>+<span style="color: rgba(0, 0, 255, 1)">info</span>, category=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">show1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
flash(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">show2 </span><span style="color: rgba(128, 0, 0, 1)">'</span>+<span style="color: rgba(0, 0, 255, 1)">info</span>, category=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">show2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
return </span><span style="color: rgba(0, 0, 255, 1)">info</span><span style="color: rgba(0, 0, 0, 1)">
@app.route(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/show1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
def show1():
return get_flashed_messages(category_filter</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">show1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">).__str__()
@app.route(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/show2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
def show2():
return get_flashed_messages(category_filter</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">show2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">).__str__()
</span><span style="color: rgba(0, 0, 255, 1)">if</span> __name__ == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
app.run(port</span>=<span style="color: rgba(128, 0, 128, 1)">5000</span>, debug=True)</pre>
</div>
<p>某一时刻,浏览器访问<code>http://127.0.0.1:5000/gen</code>,浏览器界面显示: </p>
<div class="cnblogs_code">
<pre>access at <span style="color: rgba(128, 0, 128, 1)">1404022326.39</span></pre>
</div>
<p>不过,由上面的代码可以知道,此时生成了两个flash信息,但分类(category)不同。</p>
<p>使用浏览器访问<code>http://127.0.0.1:5000/show1</code>,得到如下内容:</p>
<div class="cnblogs_code">
<pre>[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">1 access at 1404022326.39</span><span style="color: rgba(128, 0, 0, 1)">'</span>]</pre>
</div>
<p>而继续访问<code>http://127.0.0.1:5000/show2</code>,得到的内容为空:[ ]</p>
<p><span class="hljs-selector-class"> </span></p>
<p><strong><span style="font-size: 16px"> 5、在模板文件中获取flash的内容</span></strong></p>
<p> 在Flask中,<code>get_flashed_messages()</code>默认已经集成到<code>Jinja2</code>模板引擎中,易用性很强。下面是来自官方的一个示例:</p>
<p> <img src="https://img2018.cnblogs.com/blog/890652/201905/890652-20190514142209667-1307583462.jpg"></p>
<p> </p>
<p> </p>
<p> </p>
<style>p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 0, 0, 1) }
span.s1 { color: rgba(17, 142, 255, 1) }</style><br><br>
来源:https://www.cnblogs.com/cleven/p/10858016.html
頁:
[1]