前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask 学习-17.项目配置管理config

Flask 学习-17.项目配置管理config

作者头像
上海-悠悠
发布2022-08-31 14:49:30
1.3K0
发布2022-08-31 14:49:30
举报

前言

项目总是需要一定的配置的。根据应用环境不同,会需要不同的配置。比如开关调试 模式、设置密钥以及其他依赖于环境的东西。

配置入门

我们写的第一个hello world 应用是这样的 app.py

代码语言:javascript
复制
from flask import Flask

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

当我们需要开启调试模式的时候,就用到了第一个配置项

代码语言:javascript
复制
from flask import Flask

app = Flask(__name__)
app.config['DEBUG'] = True

也可以直接设置属性

代码语言:javascript
复制
app = Flask(__name__)
app.debug = True

一次更新多个配置值可以使用 dict.update() 方法:

代码语言:javascript
复制
app = Flask(__name__)
app.config.update(
    DEBUG=True,
    JSON_AS_ASCII=False
)

环境与调试

ENV 和 DEBUG 配置值是特殊的,因为它们如果在应用设置完成之 后改变,那么可以会有不同的行为表现。为了可靠的设置环境和调试, Flask 使 用环境变量。 环境用于为 Flask 、扩展和其他程序(如 Sentry )指明 Flask 运行的情境是什么。环境由 FLASK_ENV 环境变量控制,缺省值为 production 。 把 FLASK_ENV 设置为 development 可以打开调试模式。在调试模式下, flask run 会缺省使用交互调试器和重载器。如果需要脱离 环境,单独控制调试模式,请使用 FLASK_DEBUG 标示。

为把 Flask 转换到开发环境并开启调试模式,设置 FLASK_ENV: linux/mac 设置环境变量用export

代码语言:javascript
复制
$ export FLASK_ENV=development
$ flask run

windows 设置环境变量用set

代码语言:javascript
复制
> export FLASK_ENV=development
> flask run

推荐使用如上文的方式设置环境变量。虽然可以在配置或者代码中设置 环境变量无法及时地被 flask 命令读取,一个系统或者扩展就可能会使用自己 已定义的环境变量。

内置配置变量

以下配置变量由 Flask 内部使用,全部是大写字母的变量才会被配置对象所使用。因此请确保使用大写字母

名称

缺省值

描述

ENV

production

应用运行于什么环境。Flask 和 扩展可以根据环境不同而行为不同,如打开或 关闭调试模式。env 属性映射了这个配置键。本变量由 FLASK_ENV 环境变量设置。如果本变量是在代码中设置的话,可能出 现意外。

DEBUG

ENV 是 development时,为 True ;否则为 False

是否开启调试模式。使用 flask run 启动开发服务器时,遇到未能处理的 异常时会显示一个交互调试器,并且当代码变动后服务器会重启。debug 属性映射了这个配置键

TESTING

False

开启测试模式。异常会被广播而不是被应用的错误处理器处理。扩展可能也会为 了测试方便而改变它们的行为。你应当在自己的调试中开启本变量。

PROPAGATE_EXCEPTIONS

None

异常会重新引发而不是被应用的错误处理器处理。在没有设置本变量的情况下, 当 TESTING 或 DEBUG 开启时,本变量隐式地为真。

PRESERVE_CONTEXT_ON_EXCEPTION

None

当异常发生时,不要弹出请求情境。在没有设置该变量的情况下,如果 DEBUG 为真,则本变量为真。这样允许调试器错误请求数据。本变量通常不 需要直接设置。

TRAP_HTTP_EXCEPTIONS

False

如果没有处理 HTTPException 类型异常的处理器,重新引发该异常用于被 交互调试器处理,而不是作为一个简单的错误响应来返回。

TRAP_BAD_REQUEST_ERRORS

None

尝试操作一个请求字典中不存在的键,如 args 和 form ,会返回一个 400 Bad Request error 页面。开启本变量,可以把这种错误作为一个未处理的 异常处理,这样就可以使用交互调试器了。本变量是一个特殊版本的 TRAP_HTTP_EXCEPTIONS 。如果没有设置,本变量会在调试模式下开启。

SECRET_KEY

None

密钥用于会话 cookie 的安全签名,并可用于应用或者扩展的其他安全需求。本 变量应当是一个字节型长随机字符串

SESSION_COOKIE_NAME

session

会话 cookie 的名称。假如已存在同名 cookie ,本变量可改变。

SESSION_COOKIE_PATH

None

认可会话 cookie 的路径。如果没有设置本变量,那么路径为 APPLICATION_ROOT ,如果 APPLICATION_ROOT 也没有设置,那么会是 / 。

SESSION_COOKIE_HTTPONLY

True

为了安全,浏览器不会允许 JavaScript 操作标记为“ HTTP only ”的 cookie 。

SESSION_COOKIE_SECURE

False

如果 cookie 标记为“ secure ”,那么浏览器只会使用基于 HTTPS 的请求发 送 cookie 。应用必须使用 HTTPS 服务来启用本变量。

SESSION_COOKIE_SAMESITE

None

限制来自外部站点的请求如何发送 cookie 。可以被设置为 ‘Lax’ (推荐) 或者 ‘Strict’

PERMANENT_SESSION_LIFETIME

timedelta(days=31) ( 2678400 秒)

如果 session.permanent 为真, cookie 的有效期为本变量设置的数字, 单位为秒。本变量可能是一个 datetime.timedelta 或者一个 int 。

SESSION_REFRESH_EACH_REQUEST

True

当 session.permanent 为真时,控制是否每个响应都发送 cookie 。每次 都发送 cookie (缺省情况)可以有效地防止会话过期,但是会使用更多的带宽。会持续会话不受影响。

USE_X_SENDFILE

False

当使用 Flask 提供文件服务时,设置 X-Sendfile 头部。有些网络服务器, 如 Apache ,识别这种头部,以利于更有效地提供数据服务。本变量只有使用这 种服务器时才有效。

SEND_FILE_MAX_AGE_DEFAULT

timedelta(hours=12) ( 43200 秒)

当提供文件服务时,设置缓存,控制最长存活期,以秒为单位。可以是一个 datetime.timedelta 或者一个 int 。在一个应用或者蓝图上使 用 get_send_file_max_age() 可以基于单个文件重载本变量

SERVER_NAME

None

通知应用其所绑定的主机和端口。子域路由匹配需要本变量。

APPLICATION_ROOT

/

通知应用应用的根路径是什么。这个变量用于生成请求环境之外的 URL

PREFERRED_URL_SCHEME

http

当不在请求情境内时使用些预案生成外部 URL 。

MAX_CONTENT_LENGTH

None

在进来的请求数据中读取的最大字节数。如果本变量没有配置,并且请求没有指 定 CONTENT_LENGTH ,那么为了安全原因,不会读任何数据。

JSON_AS_ASCII

True

把对象序列化为 ASCII-encoded JSON 。如果禁用,那么 JSON 会被返回为一个 Unicode 字符串或者被 jsonify 编码为 UTF-8 格式。本变量应当保持 启用,因为在模块内把 JSON 渲染到 JavaScript 时会安全一点。

JSON_SORT_KEYS

True

字母排序 JSON 对象的键。这对于缓存是有用的,因为不管 Python 的哈希种 子是什么都能够保证数据以相同的方式序列化。为了以缓存为代价的性能提高可 以禁用它,虽然不推荐这样做。

JSONIFY_PRETTYPRINT_REGULAR

False

jsonify 响应会输出新行、空格和缩进以便于阅读。在调试模式下总是启用 的。

JSONIFY_MIMETYPE

application/json

jsonify 响应的媒体类型。

TEMPLATES_AUTO_RELOAD

None

当模板改变时重载它们。如果没有配置,在调试模式下会启用。

EXPLAIN_TEMPLATE_LOADING

False

记录模板文件如何载入的调试信息。使用本变量有助于查找为什么模板没有载入 或者载入了错误的模板的原因。

MAX_COOKIE_SIZE

4093

当 cookie 头部大于本变量配置的字节数时发出警告。缺省值为 4093 。更大的 cookie 会被浏览器悄悄地忽略。本变量设置为 0 时关闭警告。

默认配置项

代码语言:javascript
复制
#: Default configuration parameters.
    default_config = ImmutableDict(
        {
            "ENV": None,
            "DEBUG": None,
            "TESTING": False,
            "PROPAGATE_EXCEPTIONS": None,
            "SECRET_KEY": None,
            "PERMANENT_SESSION_LIFETIME": timedelta(days=31),
            "USE_X_SENDFILE": False,
            "SERVER_NAME": None,
            "APPLICATION_ROOT": "/",
            "SESSION_COOKIE_NAME": "session",
            "SESSION_COOKIE_DOMAIN": None,
            "SESSION_COOKIE_PATH": None,
            "SESSION_COOKIE_HTTPONLY": True,
            "SESSION_COOKIE_SECURE": False,
            "SESSION_COOKIE_SAMESITE": None,
            "SESSION_REFRESH_EACH_REQUEST": True,
            "MAX_CONTENT_LENGTH": None,
            "SEND_FILE_MAX_AGE_DEFAULT": None,
            "TRAP_BAD_REQUEST_ERRORS": None,
            "TRAP_HTTP_EXCEPTIONS": False,
            "EXPLAIN_TEMPLATE_LOADING": False,
            "PREFERRED_URL_SCHEME": "http",
            "JSON_AS_ASCII": None,
            "JSON_SORT_KEYS": None,
            "JSONIFY_PRETTYPRINT_REGULAR": None,
            "JSONIFY_MIMETYPE": None,
            "TEMPLATES_AUTO_RELOAD": None,
            "MAX_COOKIE_SIZE": 4093,
        }
    )

使用配置文件

如果把配置放在一个单独的文件中会更有用。理想情况下配置文件应当放在应用包之 外。 常见用法如下:

代码语言:javascript
复制
app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')

from_object() 方法加载一个配置对象,config.py 文件导入后,就是一个模块对象了

代码语言:javascript
复制
import config
from flask import Flask

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__)
    app.config.from_object(config)

config.py 文件放到项目的根目录

config.py文件内容

代码语言:javascript
复制
DEBUG = True
JSON_AS_ASCII = False

实例文件夹

加载配置文件的几个方法和使用区别

方法名称

参数

作用

from_object()

obj

更新给定对象的值,2种参数类型:1.字符串 2.实例对象

from_pyfile()

filename: str, silent: bool = False

从Python文件更新配置中的值

from_envvar()

variable_name: str, silent: bool = False

从指向的环境变量加载配置配置文件

from_prefixed_env()

prefix: str = “FLASK”

加载以“FLASK_”开头的任何环境变量,从配置键的env键中删除前缀。

from_file()

filename: str,load,silent: bool = False

使用“load”参数加载的文件中更新配置中的值。加载的数据被传递给from_mapping方法。

from_mapping()

mapping

更新配置

from_pyfile() 方法可以直接传一个config.py 文件名称作为参数

代码语言:javascript
复制
app.config.from_pyfile('config.py', silent=True)

from_pyfile() 方法接收文件名字(可以不是 py 文件)。silent = True 表示开启静默模式:当配置文件不存在时,程序会抛异常,静默模式开启后,函数只返回 False。

代码语言:javascript
复制
def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__)
    app.config.from_pyfile('config.py', silent=True)

此时config.py 文件就需要放到apps目录了,不然会找不到文件

Flask 0.8以后引入了一个新的属性:Flask.instance_path 。它指向一个新 名词:“实例文件夹”。实例文件夹应当处于版本控制中并进行特殊部署。 这个文件 夹特别适合存放需要在应用运行中改变的东西或者配置文件。 可以要么在创建 Flask 应用时显式地提供实例文件夹的路径,要么让 Flask 自动探测 实例文件夹。显式定义使用 instance_path 参数:

代码语言:javascript
复制
app = Flask(__name__, instance_path='/path/to/instance/folder')

于是 create_app() 工厂函数可以改成

代码语言:javascript
复制
from flask import Flask
import os

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_pyfile('config.py', silent=True)

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass
    return app

这样只需把config.py 文件放到指定的instance 目录

instance文件夹是根目录的一个子文件夹,包括了一个特定于当前应用实例的配置文件。我们不要把它提交到版本控制中。

2022年第 12期《python接口web自动化+测试开发》课程,9月17号开学!

本期上课时间:2022年9月17号 - 2022年12月17号,周六周日上午9:00-11:00

报名费:报名费3000一人(周期3个月)

联系微信/QQ:283340479

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 配置入门
  • 环境与调试
  • 内置配置变量
  • 使用配置文件
  • 实例文件夹
    • 报名费:报名费3000一人(周期3个月)
      • 联系微信/QQ:283340479
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档