1. 程式人生 > 其它 >Flask啟動應用時都幹了些啥

Flask啟動應用時都幹了些啥

一個Flask應用(Flask Application)是Flask類(Flask Class)的例項。在前面的文章中,都是通過定義全域性Flask例項的方式來編寫的Flask應用程式碼,比如:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello, World!"

Python的模組(Module)天然就是單例的,模組級別的物件自然而然也是單例的。這種方式在寫簡單的指令碼時很方便,但如果是寫專案,隨著專案逐漸擴大,會出現越來越棘手的問題。

除了定義全域性例項,還有一種方式叫做工廠函式(Factory Function),在Flask這,也能叫應用工廠(Application Factory),Flask應用工廠函式

的返回是Flask類的例項物件。

典型的Flask應用工廠函式如下所示:

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

這段程式碼可以放到flaskr目錄下面的__init__.py檔案中:

/home/user/Projects/flask-tutorial
├── flaskr/
│   ├── __init__.py

通過這段程式碼,我們可以看看Flask應用啟動時,都幹了些啥:

  1. app = Flask(__name__, instance_relative_config=True)建立了Flask例項。__name__是指當前模組的名字,這樣Flask就能找到應用啟動的入口。instance_relative_config=True告訴Flask配置檔案是用的例項資料夾的相對路徑。

    所謂例項資料夾,是指和flaskr同級的一個名字為instance的資料夾,適合存放私有配置的祕鑰或者本地資料庫等不需要上傳到Git的檔案,可以通過Flask.instance_path

    獲取完整路徑。

  2. app.config.from_mapping()設定了預設配置。SECRET_KEY是Flask用來給資料加密的私鑰。DATABASE指定了資料庫檔案路徑。

  3. app.config.from_pyfile()用來覆蓋預設配置,from_pyfile方法從檔案獲取配置,from_mapping通過鍵值對設定配置。

  4. os.makedirs(app.instance_path)確保建立了例項資料夾。

  5. @app.route()定義了路由和處理函式。

總的來說,Flask可以通過應用工廠(Application Factory)函式,在Flask應用啟動時幹這些事:例項化Flask物件→設定配置→建立例項資料夾→定義路由→定義處理函式。

Flask啟動後能看到以下日誌:

* Serving Flask app "flaskr"
* 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: 855-212-761

除了python命令啟動Flask應用,也可以直接用flask命令,示例如下:

> set FLASK_APP=flaskr
> set FLASK_ENV=development
> flask run

參考資料:

https://flask.palletsprojects.com/en/2.0.x/tutorial/factory/


所有文章公眾號首發!
如果你覺得這篇文章寫的還不錯的話,關注公眾號“dongfanger”,你的支援就是我寫文章的最大動力。

版權申明:本文為博主原創文章,轉載請保留原文連結及作者。