上一節我們簡單的創建了一個 Flask 應用,從宏觀上裏看到了 Flask 提供的功能的諸多方面,包括 Debug ,路由,靜態文件,渲染模板,Request ,Response 對象,Cookies ,Sessions 對象,打印日誌,錯誤和重定向等等。接下來就每個具體問題詳細學習。
工程佈局
首先爲這個工程創建文件夾 flasklearn 並進入文件夾,參照之前的方法創建 python 虛擬環境激活後在虛擬環境中安裝 flask
這樣就創建了一個虛擬環境 venv,他的目錄結構是這樣的,flasklearn 文件夾裏面創建了名稱爲 venv 的虛擬環境文件夾,venv 裏面包含了虛擬環境依賴的各種庫和腳本文件,我們就通過存放腳本的文件夾 Scripts 裏面的 activate 文件(作用就是用來激活當前虛擬環境)來激活創建的這個虛擬環境,準備工作做好了,最後在虛擬環境中爲我們的工程安裝 flask 。
當我們的工程變得非常大的時候,一個文件就會變得很龐大。python 工程利用包把代碼組織成多個模塊,需要的時候就導入相應的模塊。
這個工程目錄包括:
- flaskr/,他是一個包含了應用的代碼和文件的 Python 包。
- tests/,他是一個包含了測試模塊的目錄。
- venv/,Python 虛擬環境,裏面安裝了 Flask 以及其他的一些依賴。
- 安裝文件告訴 python 怎麼安裝你的工程。
- 版本控制,比如 Git 。
- 未來你可能添加的其他工程。
最後,工程佈局看起來像下面這樣:
/home/user/Projects/flasklearn
├── flaskr/
│ ├── __init__.py
│ ├── db.py
│ ├── schema.sql
│ ├── auth.py
│ ├── blog.py
│ ├── templates/
│ │ ├── base.html
│ │ ├── auth/
│ │ │ ├── login.html
│ │ │ └── register.html
│ │ └── blog/
│ │ ├── create.html
│ │ ├── index.html
│ │ └── update.html
│ └── static/
│ └── style.css
├── tests/
│ ├── conftest.py
│ ├── data.sql
│ ├── test_factory.py
│ ├── test_db.py
│ ├── test_auth.py
│ └── test_blog.py
├── venv/
├── setup.py
└── MANIFEST.in
應用安裝
一個 Flask 應用就是一個 Flask 類的實例。所有關於這個應用的如配置和 URLs,都會隨着這個類註冊。
創建一個 Flask 應用最直接的方法就是在代碼的開頭創建一個全局的 Flask 實例,就像之前的 "Hello ,World"那樣,但是項目很大的時候就會出現許多不可預知的問題。因此取而代之的是,在函數裏面創建 Flask 實例,這個函數叫做 application factory,任何配置,註冊以及其他這個應用的安裝都會在這個函數裏面發生,然後,這個應用會返回。
下面就看一下這個 application factory
創建 flaskr 目錄然後添加 __init__.py 文件。這個 __init__.py 有2個作用:一是包含 application factory,另外就是表明 flaskr 是一個 python 包。
mkdir flaskr
flaskr/__init__.py
import os
from flask import Flask
def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
if test_config is None:
# load the instance config, if it exists, when not testing
app.config.from_pyfile('config.py', silent=True)
else:
# load the test config if passed in
app.config.from_mapping(test_config)
# ensure the instance folder exists
try:
os.makedirs(app.instance_path)
except OSError:
pass
# a simple page that says hello
@app.route('/hello')
def hello():
return 'Hello, World!'
return app
create_app 就是 application factory 函數,他做了幾件事。
- app = Flask(__name__,instance_relative_config=True) 創建 Flask 實例
__name__ 是當前 Python 模塊的名稱,這個 APP 需要知道他的位置來安裝一些路徑。
instance_relative_config=True 告訴 app 配置文件,實例文件在 flaskr 包的外部,能夠保存不應該傳送到版本控制的局 部數據,比如配置隱私和數據庫文件。
- app.config.from_mapping() 設置了一些 app 將會用到的默認配置
SECRET_KEY 主要用來保證數據安全,他設置爲 'dev' 在開發的時候提供了一個合適的值,但是在應用的時候應該被重 寫爲一個隨機值。
DATABASE 是 SQLite 數據庫文件將會被保存的路經,他在 app.instance_path 之下,這是 Flask 爲實例文件夾選擇的路徑
- app.config.from_pyfile() 用實力文件夾中 config.py 文件的值重寫默認配置
Test_config 也可以傳到這個 factor,會被用來代替實例配置。
- os.makedirs() 保證 app.instance_path 的存在,Flask 不會自動穿件這個實例文件,但是他需要被創建因爲你的工程將會在這裏創建 SQLite 數據庫文件。
- @app.route() 創建一個簡單的路徑。他創建了一個 URL /hello 和返回一個 response 的函數之間的連接。
運行應用
接下來就可以告訴終端你的應用的位置,然後用 flask 命令以 development 的模式運行應用。
在瀏覽器的 5000 端口就可以看到效果