Flask 成長之路(三)---- 工程佈局和應用安裝

上一節我們簡單的創建了一個 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 端口就可以看到效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章