# 前言
本書旨在展示使用Flask的最佳實踐。
開發一個普通的Flask應用需要跟形形色色的領域打交道。比如,你經常需要操作數據庫,驗證用戶。
在接下來的幾頁里我將盡我所能來介紹處理這些事情時的“正確之道”。
我的建議并不總能有用,但我希望它們在大多數情況下都是一個好選擇。
## 假設
為了給你提供更貼切的建議,我將基于幾個基本的假設撰寫本書。當你閱讀并在自己的項目中應用這些建議時,請勿忘這一點。
### 受眾
本書的內容基于官方文檔之上。我強烈建議你深入閱讀[官方用戶指南](http://flask.pocoo.org/docs/#user-s-guide)和[新手教程](http://flask.pocoo.org/docs/tutorial/)。這將給你一個更熟悉Flask的機會。你至少需要知道什么是view,Jinja模板的基礎知識以及新手應有的其他基本概念。我會盡量避免重提用戶指南中存在的信息,所以如果直接閱讀本書,你就會有對閱讀官方文檔的急迫需求(這不錯吧?)。
雖然這么說,本書涉及的主題并不高深。本書僅僅是強調減輕開發者負擔的最佳實踐和模式。盡量避免啰嗦官方文檔中提到的內容的同時,我也會再次強調一些概念來加深印象。
在閱讀這部分內容時,你不需要重讀新手教程。
### 版本
#### Python 2 還是 Python 3
當我寫下此文, Python社區正處于從Python 2遷移到Python 3的動蕩之中。Python Software Foundation的官方態度如下:
> Python 2.x is the status quo, Python 3.x is the present and future of the language.[Python wiki: python2還是python3](http://wiki.python.org/moin/Python2orPython3)
到了版本0.10,Flask現在可以在Python 3.3上運行。就新的Flask應用是否需要使用Python 3的問題,我問過Armin Ronacher,他回答說,這不是必須的:
> 我自己現在并不用它,我也不會向別人推薦自己都不相信的東西,所以我不會推薦Python 3.
> -- Armin Ronacher, Flask作者[我和Armin Ronacher的對話](https://www.youtube.com/watch?feature=player_detailpage&v=fs20qdvm0K4#t=190)
主要的理由在于許多常用的包沒有Python 3的版本。
你總不會愿意接受用python 3開發了幾個月后發現自己不能使用包X,Y,Z……
也許總有一天Flask官方將推薦用Python 3開始新的項目,但是現在依然是Python 2的天下。
**另注**
[Python 3 Wall of Superpowers](https://python3wos.appspot.com/)記錄了一些已經移植到Python 3的包。
既然本書需要提供實踐上的建議,我將假定你正使用Python 2。
更準確地說,我將基于Python 2.7撰寫本書。隨著Flask社區的變遷,將來的更新會改變這一點,但是在當下,我們依然活在Python 2.7的世界里。
#### Flask 版本 0.10
正當本書撰寫之時,0.10是Flask的最新版本(準確說,是0.10.1版)。本書中大多數內容不會受到Flask的較小的變動的影響,但是你需要了解這一點。
## 持續集成
本書的內容將持續更新,而不是周期性發布。
這樣做有一個好處,內容可以得到及時地更新,而不會待字閨中。
所以這個網站內容將會比印刷版甚至PDF更加前沿。
## 本書用到的約定
### 各章獨立成文
本書的每一章獨立成文。許多書和教程通篇渾然一體。通常這意味著,一個示范程序或一個應用的創建和更新將貫穿全書來展示概念和主題。
本書的范例將散布于每一章節來展示概念,但不意味著這些范例可以組合成一個大的項目。
### 格式
示例代碼將以代碼塊形式來呈現。
```python
print “Hello world!”
```
目錄列表有時會被用來展示一個應用或目錄的大致結構。
```
static/
style.css
logo.png
vendor/
jquery.min.js
```
腳注會用于引用中,這樣就不會跟正文混亂起來了。
*斜體*將用來表示文件名。
**粗體**將用來表示新的或重要的內容。
> **注意**
> 這里會有容易掉進去(而且會造成大問題)的坑。
---
> **參見**
> 這里會有一些補充信息。
## 總結
* 本書包含了使用Flask的最佳實踐。
* 我假定你通讀了Flask教程
* 本書基于Python 2.7
* 本書基于Flask 0.10
* 通過年度審查,我盡量讓本書的內容保持更新。
* 本書中每一章獨立成文。
* 我通過一些約定來表達跟內容相關的附加信息。
* 每章的結尾都會出現對本章內容的總結。