-
Notifications
You must be signed in to change notification settings - Fork 20
/
flask.html
305 lines (300 loc) · 38.6 KB
/
flask.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Matt Makai">
<meta name="description" content="Flask 是一个流行的,可扩展的 Web 微框架。">
<title>Flask - Full Stack Python</title>
<link href="/f.css" rel="stylesheet">
<link rel="shortcut icon" href="/img/fsp-fav.png">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="logo-header-section">
<a href="/" style="text-decoration: none; border: none;"><img src="/img/logo-sm.png" class="logo-image" alt="Full Stack Python logo"></a>
<span class="logo-title"><a href="https://www.fullstackpython.com/">Full Stack Python</a></span>
</div>
<div class="sans-font">
<!--<a href="/blog.html" class="submenu-item-first">Blog</a> |
<a href="/books.html" class="submenu-item">Books</a> | -->
<a href="/table-of-contents.html">全部主题</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="/blog.html">Blog</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="/email.html">时讯</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="https://twitter.com/fullstackpython">@fullstackpython</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="https://www.facebook.com/fullstackpython">Facebook</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="https://github.com/mattmakai/fullstackpython.com">源码</a>
</div> </div>
</div><div class="row">
<div class="col-md-8">
<h1>Flask</h1>
<p><a href="http://flask.pocoo.org/">Flask</a> 是一个 Python Web 框架,它在设计实现时奉行 <a href="http://flask.pocoo.org/docs/design/">小核心且易于扩展的哲学</a>。</p>
<p><a href="http://flask.pocoo.org/" style="border: none;"><img src="/img/flask.jpg" width="100%" alt="Official Flask logo. Flask Artwork License." class="technical-diagram"></a></p>
<h2>为什么说 Flask Web 框架是一个不错的选择?</h2>
<p>人们认为 Flask 相比 Django 更加的 <a href="http://blog.startifact.com/posts/older/what-is-pythonic.html">Pythonic</a>, 因为 Flask Web 应用的代码在多数情况下都会更加清晰明确。 由于创建和运行一个简单的 Flask 应用只需很少的样板文件, Flask 对于初学者来说,更易于上手。</p>
<p>例如,下面是一个 Flask 版本的 "hello world" 应用(它的 Django 版本将需要更多的代码量):</p>
<div class="highlight"><pre><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">hello_world</span><span class="p">():</span>
<span class="k">return</span> <span class="s1">'Hello World!'</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</pre></div>
<p>Flask 是距 Django 好几年后才开发的,因此它能从 Django 框架的发展历程中学到很多东西。Jökull Sólberg 在他的这篇文章 <a href="http://jokull.calepin.co/my-flask-to-django-experience.html">从 Flask 换回到 Django 经历</a>中就很好地阐明了这个问题。</p>
<div class="well see-also">Flask 是对<a href="/web-frameworks.html">Web 框架</a> 概念的一种实现。在 <a href="/web-development.html">Web 开发</a> 那一章你可以了解框架的各部分组件是如何协同工作的,或者到 <a href="/table-of-contents.html">总目录</a> 页去查看其它所有主题。</div>
<h2>Flask 资源</h2>
<ul>
<li>
<p>由 <a href="https://twitter.com/miguelgrinberg">Miguel Grinberg</a> 写的这套教程是学习如何使用这个 Web 框架的绝佳入门资源。 每一篇文章都只关注一个主题,并且都是建立在之前文章的基础上。这个系列共分 18 个部分:
<a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world">#1 Hello World</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates">#2 模板</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms">#3 表单</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database">#4 数据库</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins">#5 用户登录</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars">#6 简介页与用户标识</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing">#7 单元测试</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-viii-followers-contacts-and-friends">#8 关注者、联系人及好友</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ix-pagination">#9 分页</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search">#10 全文检索</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xi-email-support">#11 邮件支持</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xii-facelift">#12 改良</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-dates-and-times">#13 日期和时间</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiv-i18n-and-l10n">#14 国际化和本地化</a>、 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xv-ajax">#15 Ajax</a> <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvi-debugging-testing-and-profiling">#16 调试、测试及性能分析</a> <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvii-deployment-on-linux-even-on-the-raspberry-pi">#17 在 Linux 上部署</a> 及 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xviii-deployment-on-the-heroku-cloud">#18 在 Heroku 云上部署</a>。 Miguel 还编写了 <a href="http://shop.oreilly.com/product/0636920031116.do">O'Reilly Flask Web 开发</a> 这本书,这也是本相当不错的学习资料。</p>
</li>
<li>
<p>如果你想一份趣味教程来学习 Flask 和 WebSocket 知识,看下我的博文 <a href="https://www.twilio.com/blog/2014/11/choose-your-own-adventure-presentations-with-reveal-js-python-and-websockets.html">使用 Reveal.js、 Python 和 WebSocket 创建一个可交互的演示文稿</a>。参照那个教程来 <a href="https://www.twilio.com/blog/2015/03/choose-your-own-adventures-presentations-wizard-mode-part-1-of-3.html">创建一个管理界面, 这是第 1 部分</a>、 <a href="https://www.twilio.com/blog/2015/05/choose-your-own-adventure-presentations-wizard-mode-part-2-of-3.html">第 2 部分</a> 和 <a href="https://www.twilio.com/blog/2015/07/choose-your-own-adventure-presentations-flask-reveal-js-websockets.html">第 3 部分</a> 向你展示了如何使用表单和 SQLAlchemy。当然这个应用还有一个开源的 <a href="https://github.com/mattmakai/choose-your-own-adventure-presentations">GitHub 代码库</a>,并同步博客 <a href="https://github.com/makaimc/choose-your-own-adventure-presentations/releases">对每一次的文章发布都作了 tag</a>。</p>
</li>
<li>
<p>这个 <a href="https://www.twilio.com/blog/2015/09/warm-phone-call-transfers-with-python-flask-and-twilio-voice.html">简单的 Flask 应用使用 Twilio Voice</a> 实现三方之间的语言通话功能。这是我发布在 Twilio 博客上的关于 Python 和 Flask 的介绍文章,非常有趣。</p>
</li>
<li>
<p><a href="http://flask.pocoo.org/extensions/">Flask 扩展中心</a> 这份精心整理的列表上都是些 Flask 最佳扩展。如果你需要的一些功能没有包含在核心框架中,你可以先到这里找找看。</p>
</li>
<li>
<p><a href="http://exploreflask.com/">探索 Flask</a> 是一本公共图书,它之前是 Kickstarter 上的一个项目,在进行开源之前大约收费了一年多时间。该书讲解了创建 Flask 应用的最佳实践和模式。 </p>
</li>
<li>
<p><a href="http://mattupstate.com/blog/how-i-structure-my-flask-applications/">如何组织我的 Flask 应用</a> 演示了这位开发者对其 Flask 应用的各部件和构架是如何进行组织的。</p>
</li>
<li>
<p><a href="https://www.twilio.com/docs/tutorials/walkthrough/browser-calls/python/flask">将打电话功能添加到你的 Web 应用中</a> 是一个重量级的 Flask 教程,里面附带了创建一个可以拨打电话和接听来电的 Web 应用的全部所需代码。</p>
</li>
<li>
<p>Jeff Knupp 写了一篇不错的文章叫 <a href="http://www.jeffknupp.com/blog/2014/01/29/productionizing-a-flask-application/">创建一个 Flask 应用</a>。</p>
</li>
<li>
<p>Plank & Whittle 这个博客上有两篇文章,一篇叫 <a href="http://www.plankandwhittle.com/packaging-a-flask-web-app/">如何打包一个 Flask Web 应用</a>,另一篇叫 <a href="http://www.plankandwhittle.com/packaging-a-flask-app-in-a-debian-package/">将 Flask 应用打包成一个 Debian 包</a>,适合已创建了一个应用并想进行部署的你看。</p>
</li>
<li>
<p>这份 <a href="http://code.tutsplus.com/tutorials/an-introduction-to-pythons-flask-framework--net-28822">Flask 教程</a> 是另一个不错的框架入门资料。</p>
</li>
<li>
<p><a href="http://readwrite.com/2014/07/11/one-click-messaging-app">创建你自己的类似 Yo 的极简消息应用</a> 示范了一个非常基本的 Flask 应用,使用 <a href="https://www.nitrous.io/">Nitrous.io</a> 来创建项目,并用 <a href="https://www.twilio.com/">Twilio</a> 来提供短信功能。</p>
</li>
<li>
<p>这个博客系列文章 "其实并不神奇",讲解了 Flask 中无处不在的 @app.route 这个装饰器到底是如何运作的。这个系列分为两部分, <a href="http://ains.co/blog/things-which-arent-magic-flask-part-1.html">第 1 部分</a> 和 <a href="http://ains.co/blog/things-which-arent-magic-flask-part-2.html">第 2 部分</a>。</p>
</li>
<li>
<p><a href="http://www.realpython.com/blog/python/flask-by-example-part-1-project-setup/">通过示例学 Flask: 第 1 部分</a> 对 Flask 工程如何进行初始设置进行了讲解。 <a href="http://www.realpython.com/blog/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/">第 2 部分</a> 讲解了如何使用 PostgreSQL、 SQLAlchemy 和 Alembic。 <a href="https://realpython.com/blog/python/flask-by-example-part-3-text-processing-with-requests-beautifulsoup-nltk/">第 3 部分</a> 描述了如何使用 BeautifulSoup 和 NLTK 进行文本处理。<a href="https://realpython.com/blog/python/flask-by-example-implementing-a-redis-task-queue/">第 4 部分</a> 展示了如何用 Flask 和 Redis 来创建一个任务队列。</p>
</li>
<li>
<p><a href="https://www.twilio.com/blog/2014/10/branded-mms-coupon-generation-with-python-and-twilio.html">使用 Python 和 Twilio 生成品牌的彩信优惠券</a> 是我写的一篇 Flask 教程,讲述如何创建一个 Web 应用并通过彩信发送品牌条码优惠券。这篇文章对应用开发的每个步骤(从一片空目录开始直到创建一个可以部署到 Heroku 的应用)都作了一一的讲解。</p>
</li>
<li>
<p><a href="https://www.digitalocean.com/community/articles/how-to-structure-large-flask-applications">如何组织一个大型的 Flask 应用</a> 涉及的这个主题,是你一旦要开始在你的 Flask 应用 中增加重要的功能时就会很快碰到的。</p>
</li>
<li>
<p><a href="http://fewstreet.com/2015/01/16/flask-blueprint-templates.html">Flask 模板</a> 针对大型项目,展示了如何组织你的多个 <a href="http://flask.pocoo.org/docs/0.10/blueprints/">blueprints</a>。</p>
</li>
<li>
<p><a href="http://blog.miguelgrinberg.com/post/video-streaming-with-flask">Flask 实现视频流功能</a> 是 Miguel Grinberg 的另一篇精彩教程,内容涉及视频流。</p>
</li>
<li>
<p><a href="https://medium.com/@5hreyans/the-one-weird-trick-that-cut-our-flask-page-load-time-by-70-87145335f679">一行代码并能减少 Flask 60% 的页面加载时间</a> 是篇重要的文章,阐明了优化 Flask 模板的缓存大小在某些情况下能显著地增加性能。</p>
</li>
<li>
<p><a href="https://www.twilio.com/blog/2014/03/unit-testing-your-twilio-app-using-pythons-flask-and-nose.html">利用 Python 的 Flask 和 Nose 来对你的 Twilio 应用进行单元测试</a> 涉及如何将 Twilio API 集成到 Flask 应用中,以及如何用 <a href="https://nose.readthedocs.org/en/latest/">nose</a> 进行功能测试。</p>
</li>
<li>
<p>Flask 文档上有一些小例子,演示了如果在 <a href="http://flask.pocoo.org/docs/deploying/wsgi-standalone/">独立的 WSGI 容器</a> 中部署 Flask。</p>
</li>
<li>
<p><a href="https://realpython.com/blog/python/handling-email-confirmation-in-flask/">在 Flask 中如何确认邮件地址</a> 很好地示范了如何将邮件地址与用户的登录信息进行匹配。</p>
</li>
<li>
<p>如果你还不是很了解为什么在生产环境中 <a href="/deployment.html">部署</a>后,必须要将 <code>DEBUG</code> 设置成 <code>False</code> 的话,你应该读读这篇文章 <a href="http://labs.detectify.com/post/130332638391/how-patreon-got-hacked-publicly-exposed-werkzeug">Patreon 是如何被黑掉的</a>。</p>
</li>
</ul>
<h2>开源 Flask 示例项目</h2>
<ul>
<li>
<p><a href="https://github.com/mattmakai/choose-your-own-adventure-presentations">交互式的演示文稿</a> 将 Flask 与 <a href="http://lab.hakim.se/reveal-js/">Reveal.js</a> 及短信结合,创建了一个观众能够投票决定事件进程的演示文稿。它的代码在 MIT 许可下完全开源,它使用 <a href="https://flask-socketio.readthedocs.org/en/latest/">Flask-SocketIO</a> 和 <a href="https://flask-wtf.readthedocs.org/en/latest/">Flask-WTF</a> 项目来支持投票和表单输入功能。</p>
</li>
<li>
<p><a href="https://github.com/skylines-project/skylines">Skylines</a> 是一个开源的航班信息追踪系统,它用 Flask 实现。可以在 <a href="https://skylines.aero/">这里看到这个应用的运行效果</a>。</p>
</li>
<li>
<p><a href="https://github.com/miguelgrinberg/microblog">Microblog</a> 这个开源项目是和 Miguel Grinberg 的 O'Reilly Flask 那本书配套的。</p>
</li>
<li>
<p><a href="https://github.com/mjhea0/flaskr-tdd">Flaskr TDD</a> 遵循了官方的 Flask 教程, 并在项目中增加了测试驱动开发和 JQuery。</p>
</li>
<li>
<p>这是一个 <a href="http://charlesleifer.com/blog/saturday-morning-hack-a-little-note-taking-app-with-flask/">笔记记录应用</a>,这是它在 <a href="https://gist.github.com/coleifer/632d3c9aa6b2ea519384">Gist 上的源代码</a>。</p>
</li>
<li>
<p><a href="https://github.com/BouncyNudibranch/bean-counter">Bean Counter</a> 是一个开源的 Flask 应用,用于追踪咖啡的相关信息。</p>
</li>
<li>
<p><a href="http://flaskbb.org/">FlaskBB</a> 是一个用 Flask 实现的论坛应用。</p>
</li>
<li>
<p><a href="https://github.com/Jahaja/psdash">psdash</a> 这个应用是用 Flask 和 psutils 创建的,它能显示运行它的计算机的相关信息。</p>
</li>
</ul>
<h2>Flask 项目模板</h2>
<ul>
<li>
<p><a href="https://github.com/kamalgill/flask-appengine-template">Flask App Engine 模板</a> ,采用这个模板设置,你的 Flask 应用就能在 Google App Engine 上运行。</p>
</li>
<li>
<p><a href="https://github.com/JackStouffer/Flask-Foundation">Flask Foundation</a> 是一个 Flask 项目模板。它还有一个 <a href="https://jackstouffer.github.io/Flask-Foundation/">相应的网站</a>,讲解了这个模板中包含了哪些扩展。</p>
</li>
<li>
<p><a href="https://github.com/sloria/cookiecutter-flask">Cookiecutter Flask</a> 这个项目模板使用了 <a href="https://github.com/audreyr/cookiecutter">Cookiecutter</a>。</p>
</li>
<li>
<p><a href="https://github.com/MaxHalford/Flask-Boilerplate">Flask-Boilerplate</a> 是另一个项目模板,它提供了注册、登录和密码重置等功能。</p>
</li>
<li>
<p>Sunscrapers 公司提供了这个 <a href="https://github.com/sunscrapers/flask-boilerplate">采用了 SQLAlchemy、 py.test 和 Celery 的 Flask 样板项目</a> 完全符合 Flask 项目的结构要求。</p>
</li>
</ul>
<h2>Flask 框架学习清单</h2>
<ol>
<li>
<p>在你的本地开发机上 <a href="http://flask.pocoo.org/docs/installation/">安装 Flask</a> 。</p>
</li>
<li>
<p>根据上面的 “Flask 资源”节里列出的那 18 个 Flask 教程,依次练习。</p>
</li>
<li>
<p>在 <a href="http://flask.pocoo.org/extensions/">Flask 扩展中心</a> 查找你的项目所需的扩展。</p>
</li>
<li>
<p>在学习和研究完那 18 个 Flask 教程以及下面列出的开源示例应用后,开始编写你自己的 Flask 应用 。</p>
</li>
<li>
<p>查看 <a href="/deployment.html">部署那一章</a>,将你的 Flask 项目发布上网上。</p>
</li>
</ol>
<h3>接下来你想学习哪些与 Web 开发相关的主题呢?</h3>
<div class="row">
<div class="col-md-4">
<div class="well select-next">
<a href="/deployment.html" class="btn btn-success btn-full"><svg width="28" height="30" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1792 640q0 26-19 45l-512 512q-19 19-45 19t-45-19-19-45v-256h-224q-98 0-175.5 6t-154 21.5-133 42.5-105.5 69.5-80 101-48.5 138.5-17.5 181q0 55 5 123 0 6 2.5 23.5t2.5 26.5q0 15-8.5 25t-23.5 10q-16 0-28-17-7-9-13-22t-13.5-30-10.5-24q-127-285-127-451 0-199 53-333 162-403 875-403h224v-256q0-26 19-45t45-19 45 19l512 512q19 19 19 45z" fill="#fff"/></svg></a>
<p class="under-btn">我已经创建了一个 Python Web 应用,那我如何部署呢?</p> </div>
</div>
<div class="col-md-4">
<div class="well select-next">
<a href="/other-web-frameworks.html" class="btn btn-success btn-full"><svg width="28" height="30" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1088 1256v240q0 16-12 28t-28 12h-240q-16 0-28-12t-12-28v-240q0-16 12-28t28-12h240q16 0 28 12t12 28zm316-600q0 54-15.5 101t-35 76.5-55 59.5-57.5 43.5-61 35.5q-41 23-68.5 65t-27.5 67q0 17-12 32.5t-28 15.5h-240q-15 0-25.5-18.5t-10.5-37.5v-45q0-83 65-156.5t143-108.5q59-27 84-56t25-76q0-42-46.5-74t-107.5-32q-65 0-108 29-35 25-107 115-13 16-31 16-12 0-25-8l-164-125q-13-10-15.5-25t5.5-28q160-266 464-266 80 0 161 31t146 83 106 127.5 41 158.5z" fill="#fff"/></svg></a>
<p class="under-btn">还有哪些 Web 框架?</p> </div>
</div>
<div class="col-md-4">
<div class="well select-next">
<a href="/source-control.html" class="btn btn-success btn-full"><svg width="28" height="30" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M672 1472q0-40-28-68t-68-28-68 28-28 68 28 68 68 28 68-28 28-68zm0-1152q0-40-28-68t-68-28-68 28-28 68 28 68 68 28 68-28 28-68zm640 128q0-40-28-68t-68-28-68 28-28 68 28 68 68 28 68-28 28-68zm96 0q0 52-26 96.5t-70 69.5q-2 287-226 414-68 38-203 81-128 40-169.5 71t-41.5 100v26q44 25 70 69.5t26 96.5q0 80-56 136t-136 56-136-56-56-136q0-52 26-96.5t70-69.5v-820q-44-25-70-69.5t-26-96.5q0-80 56-136t136-56 136 56 56 136q0 52-26 96.5t-70 69.5v497q54-26 154-57 55-17 87.5-29.5t70.5-31 59-39.5 40.5-51 28-69.5 8.5-91.5q-44-25-70-69.5t-26-96.5q0-80 56-136t136-56 136 56 56 136z" fill="#fff"/></svg></a>
<p class="under-btn">如何存储我的源代码并进行版本控制?> </div>
</div>
</div><div id="mc_embed_signup">
<form action="//mattmakai.us2.list-manage.com/subscribe/post?u=b7e774f0c4f05dcebbfee183d&id=b22335388d" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
<div id="mc_embed_signup_scroll">
<h4>在这里注册以便每月能收到一份邮件资料,内容包含本站的主要更新、教程和 Python 书籍的打折码等。</h4>
<div class="row">
<div class="col-md-9">
<input type="email" value="" name="EMAIL" class="email form-control" id="mce-EMAIL" placeholder="邮箱地址" required>
<div style="position: absolute; left: -5000px;"><input type="text" name="b_b7e774f0c4f05dcebbfee183d_b22335388d" tabindex="-1" value=""></div>
</div>
<div class="col-md-3">
<div class="clear"><input type="submit" value="订阅" name="subscribe" id="mc-embedded-subscribe" class="btn btn-success" style="font-family: 'Helvetica Neue';"></div>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="col-md-offset-1 col-md-3" id="sidebar">
<div class="panel">
<div class="panel-heading">
<h3 class="panel-head">赞助商</h3>
</div>
<div class="panel-body">
<a href="https://realpython.com/?utm_source=fsp&utm_medium=promo&utm_campaign=flask"><img src="/img/sponsored/realpython.jpg" alt="Real Python logo" width="100%"></a>
<p style="font-size: .8em;">如果你要找一本循序渐进的 Flask 教程,我推荐你
<a href="https://realpython.com/?utm_source=fsp&utm_medium=promo&utm_campaign=flask" onclick="trackOutboundLink('https://realpython.com/?utm_source=fsp&utm_medium=promo&utm_campaign=flask'); return false;">看看 Real Python</a>.
</p>
</div>
</div>
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-head">邮件获取更新</h3>
</div>
<div class="panel-body">
<div id="mc_embed_signup">
<form action="//mattmakai.us2.list-manage.com/subscribe/post?u=b7e774f0c4f05dcebbfee183d&id=b22335388d" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
<div id="mc_embed_signup_scroll">
<h5>注册以便每月能收到一份邮件资料,内容包含本站的主要更新和 Python 教程。</h5>
<input type="email" value="" name="EMAIL" class="email form-control" id="mce-EMAIL" placeholder="邮箱地址" required>
<div style="position: absolute; left: -5000px;"><input type="text" name="b_b7e774f0c4f05dcebbfee183d_b22335388d" tabindex="-1" value=""></div>
<input type="submit" value="订阅" name="subscribe" id="mc-embedded-subscribe" class="btn btn-success" style="font-family: 'Helvetica Neue'; margin-top: 5px;">
</div>
</form>
</div>
</div>
</div><div class="panel" id="full-toc">
<div class="panel-heading">
<h3 class="panel-head"><a href="/table-of-contents.html" style="color: #fff;">目录</a></h3>
</div>
<div class="list-group">
<a href="/introduction.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>1. 简介</a><a href="/learning-programming.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>学习编程</a><a href="/why-use-python.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>为什么用 Python?</a><a href="/python-2-or-3.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Python 2 还是 3?</a><a href="/enterprise-python.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>企业 Python</a><a href="/python-community.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Python Community</a><a href="/best-python-podcasts.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Best Python Podcasts</a><a href="/best-python-resources.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>最佳 Python 资源</a><a href="/best-python-videos.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>最佳 Python 视频</a><a href="/development-environments.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>2. 开发环境</a><a href="/vim.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Vim</a><a href="/emacs.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Emacs</a><a href="/python-programming-language.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>3. 核心语言</a><a href="/generators.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>生成器</a><a href="/comprehensions.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>推导式</a><a href="/web-development.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>4. Web 开发</a><a href="/web-frameworks.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 框架</a><a href="/django.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Django</a><a href="/flask.html" class="list-group-item smaller-item active" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Flask</a><a href="/bottle.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Bottle</a><a href="/pyramid.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Pyramid</a><a href="/morepath.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Morepath</a><a href="/other-web-frameworks.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>其它 Web 框架</a><a href="/web-design.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 设计</a><a href="/cascading-style-sheets.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>级联样式表 (CSS)</a><a href="/javascript.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>JavaScript</a><a href="/websockets.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>WebSockets</a><a href="/template-engines.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>模板引擎</a><a href="/web-application-security.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 应用安全</a><a href="/static-site-generator.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>静态网站生成器</a><a href="/jinja2.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Jinja2</a><a href="/data.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>5. 数据</a><a href="/databases.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>关系型数据库</a><a href="/no-sql-datastore.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>NoSQL 数据存储</a><a href="/object-relational-mappers-orms.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>对象关系映射器</a><a href="/postgresql.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>PostgreSQL</a><a href="/mysql.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>MySQL</a><a href="/sqlite.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>SQLite</a><a href="/application-programming-interfaces.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>6. Web APIs</a><a href="/api-integration.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>API 集成</a><a href="/api-creation.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>API 的创建</a><a href="/twilio.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Twilio</a><a href="/deployment.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>7. 部署</a><a href="/servers.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>服务器</a><a href="/platform-as-a-service.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>平台即服务(PaaS)</a><a href="/operating-systems.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>操作系统</a><a href="/web-servers.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 服务器</a><a href="/wsgi-servers.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>WSGI 服务器</a><a href="/source-control.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>源码控制</a><a href="/application-dependencies.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>应用程序依赖</a><a href="/static-content.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>静态内容</a><a href="/task-queues.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>任务队列</a><a href="/configuration-management.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>配置管理</a><a href="/continuous-integration.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>持续集成</a><a href="/logging.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>日志</a><a href="/monitoring.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>监控</a><a href="/web-analytics.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 分析</a><a href="/docker.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Docker</a><a href="/caching.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>缓存</a><a href="/microservices.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>微服务</a><a href="/devops.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>DevOps</a><a href="/nginx.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Nginx</a><a href="/apache-http-server.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Apache HTTP 服务器</a><a href="/caddy.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Caddy</a><a href="/green-unicorn-gunicorn.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Green Unicorn (Gunicorn)</a><a href="/ubuntu.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Ubuntu</a><a href="/pelican.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Pelican</a><a href="/lektor.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Lektor</a><a href="/mkdocs.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>MkDocs</a><a href="/testing.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>8. 测试</a><a href="/unit-testing.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>单元测试</a><a href="/integration-testing.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>集成测试</a><a href="/code-metrics.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>代码度量</a><a href="/debugging.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>调试</a><a href="/what-full-stack-means.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>9. Meta</a><a href="/bots.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Bots</a><a href="/change-log.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Change Log</a><a href="/future-directions.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Future Directions</a><a href="/about-author.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>About the Author</a><a href="/sqlalchemy.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>SQLAlchemy</a><a href="/peewee.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Peewee</a> <a href="/table-of-contents.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",san-serif;background-color:#22B24C; color: #fff;'>...或者<span style="border-bottom: 1px dotted;">显示全部目录内容</span>.</a>
</div>
</div> <div class="panel">
<div class="panel-heading"><h3 class="panel-head">Flask</h3></div>
<div class="panel-body">
重要的更新内容会通过 Twitter 账号<a href="https://twitter.com/fullstackpython">@fullstackpython</a>发布。
<hr/>
需要更加详细的教程吗?请看
<a href="http://www.deploypython.com/">《The Full Stack Python Guide to Deployments》。</a>
</div>
</div>
<div class="panel" id="mobile-toc">
<div class="panel-heading">
<h3 class="panel-head"><a href="/table-of-contents.html" style="color: #fff;">Chapters</a></h3>
</div>
<div class="list-group">
<a href="/introduction.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>1. 简介</a><a href="/development-environments.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>2. 开发环境</a><a href="/python-programming-language.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>3. 核心语言</a><a href="/web-development.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>4. Web 开发</a> <a href="/flask.html" class="list-group-item smaller-item active" style='font-family: "Helvetica Neue",sans-serif;'>» Flask</a>
<a href="/data.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>5. 数据</a><a href="/application-programming-interfaces.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>6. Web APIs</a><a href="/deployment.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>7. 部署</a><a href="/testing.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>8. 测试</a><a href="/what-full-stack-means.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>9. Meta</a> <a href="/table-of-contents.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",san-serif;background-color:#22B24C; color: #fff;'>...or <span style="border-bottom: 1px dotted;">view the full table of contents</span>.</a>
</div>
</div></div></div>
<hr/>
</div>
<div class="container">
<div class="footer pull-right">
This site is based on <a href="https://github.com/mattmakai">Matt Makai</a>'s project <a href="https://github.com/mattmakai/fullstackpython.com">Full Stack Python</a>, thanks for his excellent work!
</div>
</div>
<div class="container">
<div class="footer pull-right" style="text-align:right; font-size:85%;">
<p>此网站由 <a href="https://github.com/haiiiiiyun">@haiiiiiyun</a> 和 <a href="https://github.com/haiiiiiyun/fullstackpython.cn/graphs/contributors">开源爱好者们</a> 共同维护。
若发现错误或想贡献,请访问: <a href="https://github.com/haiiiiiyun/fullstackpython.cn/">Github fullstackpython.cn 项目</a>
</p>
</div>
</div><script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-77551377-2', 'auto');
ga('send', 'pageview');
</script> <div style="display: none;"><img src="https://www.linkedin.com/in/matthewmakai?authType=name&authToken=thoI" /></div>
<script type='text/javascript'>
var trackOutboundLink = function(url) { ga('send', 'event', 'outbound', 'click', url, {'hitCallback': function () { document.location = url; } }); }
</script>
</body>
</html>