iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
Software Development

都是 P 開頭的程式語言,你是在 py 啥啦系列 第 11

[11] [燒瓶裡的部落格] 01. 初始化一個 Flask 專案 - 使用工廠模式

後端 side project 就是要 泛舟 部落格啊,不然要幹嘛
官方教學做一個基本的 CRUD 功能的部落格

首先建立專案之後再建立兩個資料夾

  • flaskr:主要的程式
  • tests:測試模組

最好在這邊就開始版本控制,這樣比較能記得每一個段落在做什麼

工廠模式 Application Factories

Flask 應用程式是 Flask class 的 instance
首先我們使用工廠模式(application factory)在函數內部建立 Flask 實體,而不是建立全域實體
所有和這個應用程式相關的設定都會在這個函數內部完成,然後回傳這個實體

建立檔案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是一個工廠模式的函數,後面會用到
這個看似簡單的函數其實已經做了很多事情

1. 創建 Flask 實體

app = Flask(__name__, instance_relative_config=True)

  • __name__是當前 Python 模組的名稱
    app 需要知道在哪裡設置路徑,使用__name__是一個方便的方法
  • instance_relative_config=True
    告訴 app 設定檔案是使用位在 instance folder 的相對路徑
    實體的資料夾在 flaskr 的外面
    用來放一些不該進入版本控制的設定檔,例如資料庫連線資訊

2. 預設值設定

app.config.from_mapping():設定 App 的預設設定

  • SECRET_KEY 是被 Flask 和擴展包用於保證資料安全的
    在開發過程中,為了方便可以設置為 'dev'
    但是在發布的時候應該使用一個亂數產生的字串
  • DATABASE:說明SQLite資料庫文件存放的路徑
    位於 Flask 用來存放實體的 app.instance_path 內,之後會詳細說明

3. 客製化設定檔

app.config.from_pyfile():如果 config.py 存在的話,使用 config.py 中的值來覆蓋掉預設設定
例如正式部署的時候,設定一個正式的 SECRET_KEY

  • test_config 也會被傳送到工廠內,並起會取代原先實體的設定
    這樣可以讓測試和開發的設定各自獨立

4. 自動建立存放 instance 的資料夾

os.makedirs()
可以確保 app.instance_path 存在,因為 Flask 不會自動建立資料夾
但是必須確保這個資料夾存在,因為 SQLite 資料庫檔案會被保存在裡面

5. 啟動應用程式

@app.route()
建立一個簡單的路由,這樣在繼續下面的內容之前可以先看看 App 如何運行的
它聲明了 URL /hello 和一個函數之間的關聯
這個函數會回傳一個 response,即一個 「Hello, World!」字串

讓 App 跑起來

使用指令列,或是進入你的 pipenv 虛擬環境中

pipenv install flask
export FLASK_APP=flaskr
export FLASK_ENV=development
flask run

接著就會看到終端機提示訊息

 * Serving Flask app 'flaskr' (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 681-825-908

在瀏覽器開啟 http://127.0.0.1:5000/hello
就會看到「Hello, World!」出現在畫面上
恭喜你,Flask 成功執行了!


上一篇
[10] [Flask 快速上手筆記] 09.心得
下一篇
[12] [燒瓶裡的部落格] 02. 定義和使用資料庫 - 使用 SQLite
系列文
都是 P 開頭的程式語言,你是在 py 啥啦30

尚未有邦友留言

立即登入留言