在Flask中我们推荐通过下面的方式对我们的应用程序进行配置。
使用配置文件来配置应用程序不敏感数据使用环境变量来配置用户敏感数据,比如数据库相关信息,以及一些秘钥等等 Flask内置配置变量 名称描述初始值ENV应用运行于什么环境。 Flask 和 扩展可以根据环境不同而行为不同,如打开或 关闭调试模式。 env 属性映射了这个配置键。本变量由 FLASK_ENV 环境变量设置。如果本变量是在代码中设置的话,可能出 现意外。productionDEBUG是否开启调试模式。使用 flask run 启动开发服务器时,遇到未能处理的 异常时会显示一个交互调试器,并且当代码变动后服务器会重启。 debug 属性映射了这个配置键。当 ENV 是 ‘development’ 时,本变量会启用,并且会被 FLASK_DEBUG 环境变量 重载。如果本变量是在代码中设置的话,可能会出现意外。ENV 是 ‘development’ 时,为 True ;否则为 FalseTESTING开启测试模式。异常会被广播而不是被应用的错误处理器处理。扩展可能也会为 了测试方便而改变它们的行为。你应当在自己的调试中开启本变量。FalsePROPAGATE_EXCEPTIONS异常会重新引发而不是被应用的错误处理器处理。在没有设置本变量的情况下, 当 TESTING 或 DEBUG 开启时,本变量隐式地为真。NonePRESERVE_CONTEXT_ON_EXCEPTION当异常发生时,不要弹出请求情境。在没有设置该变量的情况下,如果 DEBUG 为真,则本变量为真。这样允许调试器错误请求数据。本变量通常不 需要直接设置。NoneTRAP_HTTP_EXCEPTIONS如果没有处理 HTTPException 类型异常的处理器,重新引发该异常用于被 交互调试器处理,而不是作为一个简单的错误响应来返回。FalseTRAP_BAD_REQUEST_ERRORS尝试操作一个请求字典中不存在的键,如 args 和 form ,会返回一个 400 Bad Request error 页面。开启本变量,可以把这种错误作为一个未处理的 异常处理,这样就可以使用交互调试器了。本变量是一个特殊版本的 TRAP_HTTP_EXCEPTIONS 。如果没有设置,本变量会在调试模式下开启。NoneSECRET_KEY密钥用于会话 cookie 的安全签名,并可用于应用或者扩展的其他安全需求。本 变量应当是一个字节型长随机字符串,NoneSESSION_COOKIE_NAME会话 cookie 的名称。假如已存在同名 cookie ,本变量可改变。sessionSESSION_COOKIE_PATH认可会话 cookie 的路径。如果没有设置本变量,那么路径为 APPLICATION_ROOT ,如果 APPLICATION_ROOT 也没有设置,那么会是 / 。NoneSESSION_COOKIE_HTTPONLY为了安全,浏览器不会允许 JavaScript 操作标记为“ HTTP only ”的 cookie 。TrueSESSION_COOKIE_SECURE如果 cookie 标记为“ secure ”,那么浏览器只会使用基于 HTTPS 的请求发 送 cookie 。应用必须使用 HTTPS 服务来启用本变量。FalseSESSION_COOKIE_SAMESITE限制来自外部站点的请求如何发送 cookie 。可以被设置为 ‘Lax’ (推荐) 或者 ‘Strict’NonePERMANENT_SESSION_LIFETIME如果 session.permanent 为真, cookie 的有效期为本变量设置的数字, 单位为秒。本变量可能是一个 datetime.timedelta 或者一个 int 。timedelta(days=31) ( 2678400 秒)SESSION_REFRESH_EACH_REQUEST当 session.permanent 为真时,控制是否每个响应都发送 cookie 。每次 都发送 cookie (缺省情况)可以有效地防止会话过期,但是会使用更多的带宽。 会持续会话不受影响。TrueUSE_X_SENDFILE当使用 Flask 提供文件服务时,设置 X-Sendfile 头部。有些网络服务器, 如 Apache ,识别这种头部,以利于更有效地提供数据服务。本变量只有使用这 种服务器时才有效。FalseSEND_FILE_MAX_AGE_DEFAULT当提供文件服务时,设置缓存,控制最长存活期,以秒为单位。可以是一个 datetime.timedelta 或者一个 int 。在一个应用或者蓝图上使 用 get_send_file_max_age() 可以基于单个文件重载本变 量timedelta(hours=12) ( 43200 秒)SERVER_NAME通知应用其所绑定的主机和端口。子域路由匹配需要本变量。NoneAPPLICATION_ROOT通知应用应用的根路径是什么。这个变量用于生成请求环境之外的 URL/PREFERRED_URL_SCHEME当不在请求情境内时使用些预案生成外部 URL 。httpMAX_CONTENT_LENGTH在进来的请求数据中读取的最大字节数。如果本变量没有配置,并且请求没有指 定 CONTENT_LENGTH ,那么为了安全原因,不会读任何数据。NoneJSON_AS_ASCII把对象序列化为 ASCII-encoded JSON 。如果禁用,那么 JSON 会被返回为一个 Unicode 字符串或者被 jsonify 编码为 UTF-8 格式。本变量应当保持 启用,因为在模块内把 JSON 渲染到 JavaScript 时会安全一点。TrueJSON_SORT_KEYS字母排序 JSON 对象的键。这对于缓存是有用的,因为不管 Python 的哈希种 子是什么都能够保证数据以相同的方式序列化。为了以缓存为代价的性能提高可 以禁用它,虽然不推荐这样做。TrueJSONIFY_PRETTYPRINT_REGULARjsonify 响应会输出新行、空格和缩进以便于阅读。在调试模式下总是启用 的。FalseJSONIFY_MIMETYPEjsonify 响应的媒体类型。application/jsonTEMPLATES_AUTO_RELOAD当模板改变时重载它们。如果没有配置,在调试模式下会启用。NoneEXPLAIN_TEMPLATE_LOADING记录模板文件如何载入的调试信息。使用本变量有助于查找为什么模板没有载入 或者载入了错误的模板的原因。FalseMAX_COOKIE_SIZE当 cookie 头部大于本变量配置的字节数时发出警告。缺省值为 4093 。 更大的 cookie 会被浏览器悄悄地忽略。本变量设置为 0 时关闭警告。4093配置文件本身实质是 Python 文件。只有全部是大写字母的变量才会被配置对象所使 用。因此请确保使用大写字母。
典型的配置文件:
此时我们需要使用from_pyfile()来加载配置文件。
app.config.from_pyfile('config.py')类似的还有使用类和类的继承来配置:
在使用的时候必须使用 from_object()进行加载:
from flask import Flask from config import DevelopmentConfig app = Flask(__name__) app.config.from_object(DevelopmentConfig()) 使用环境变量大多数应用需要一个以上的配置。最起码需要一个配置用于生产服务器,另一个配置 用于开发。应对这种情况的最简单的方法总是载入一个缺省配置,并把这个缺省配置 作为版本控制的一部分。然后,把需要重载的配置,如前文所述,放在一个独立的文 件中:
from flask import Flask from config import ProductionConfig app = Flask(__name__) app.config.from_object(ProductionConfig()) app.config.from_envvar('FLASK_PRODUCTION_CONFIG')然后在环境变量中设置FLASK_PRODUCTION_CONFIG为配置文件路径即可。
在pycharm中可参考下面配置步骤:
另外可能有些小伙伴都试过在配置文件中开启debug,然并未起作用。
首先,我们前面说过了,在pycharm中开启debug的方法,其中之一为勾选FLASK_DEBUG: 运行flask程序后,我们会发现启动日志中有相关环境变量的输出: 这是pycharm的环境,实际上在操作系统中的环境变量中是不存在的,也就是说这是依托于pycharm运行的。
我们可以打开控制台看看: 此时,我们打开使用环境变量配置后运行代码:
app.config.from_envvar('FLASK_PRODUCTION_CONFIG')此时会提示我们找不到环境变量:FLASK_PRODUCTION_CONFIG。
如果我们需要在找不到环境变量的时候还能够正常的启动程序,那么我们需要指定
app.config.from_envvar('FLASK_PRODUCTION_CONFIG',silent = True)在windows中我们可以在cmd中使用set命令查看环境变量,
使用set 变量名=变量内容来设置环境变量,注意只在cmd窗口有效。
首先我们打开cmd并激活虚拟环境:
然后设置env为development,并设置FLASK_PRODUCTION_CONFIG: ok,一切正常。
