[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 成功执行了!


<<:  110/10 - Intent.ACTION_MEDIA_SCANNER_SCAN_FILE弃用

>>:  追求JS小姊姊系列 Day10 -- 如果时间能重来,我不想跟工具人聊天(下)

Day 14 Detect objects in images with the Custom Vision service

Object detection - Recognize individual types of o...

【JavaScript】if 的简洁写法| 三元运算子

判断的条件?符合条件执行冒号前:不符合条件执行冒号後 看 w3c setInterval() 的范例...

EP21 - [Ruby on Rails] 新增订单

Youtube 频道:https://www.youtube.com/c/kaochenlong ...

Day26 - 【概念篇】Keycloak使用基本概念 - 第二部分: User & Group

本系列文之後也会置於个人网站 帐号(User) 基本讯息 接着来看看与帐号有关的设定。 在之前,已...

Day29 - DeFi在红什麽?谈去中心化借贷、支付

既然DeFi是一个建立在区块链网路上的金融体系,透过智能合约,不需仰赖特定第三方授权或管理,让原本可...