一、相关介绍
一般来说,在执行flask run命令运行程序前,我们需要提供程序实例所在模块的位置 。
Flask会自动探测程序实例,自动探测存在下面这些规则:
- 从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例
- 从环境变量FLASK_APP对应的值寻找名为app或application的程序实例
如果你程序主模块命名为app.py,flask run命令会自动在其中寻找程序实例。如果你的程序主模块名是其他名称,
比如hello.py,那么需要设置环境变量FLASK_APP,将包含程序实例的模块名赋值给这个变量。
所以上一篇:项目文件布局使用Flask()方法时,传递了project
参数;
Flask的自动发现程序实例机制还有第三条规则:如果安装了python-dotenv,那么在使用flask run或其它命令时
会使用它自动从.flaskenv文件和.env文件中加载环境变量。
当安装了python-dotenv时,Flask在加载环境变量的优先级是:手动设置的环境变量>.env中设置的环境变>.flaskenv设置的环境变量。
二、系统环境变量配置
对于不适合写在程序里的配置,比如密码等,需要把配置写入系统环境变量,然后使用os模块的getenv()方法获取,第二个参数作为默认值
set MAIL_USERNAME=me@greyli.com # windows
export MAIL_USERNAME=me@greyli.com # *unix
import os
from flask import Flask
app = Flask(__name__)
app.config['MAIL_USERNAME'] = os.getenv('MAIL_USERNAME', 'me@greyli.com')
os.getenv()是Python中的一个函数,用于获取系统环境变量的值。它可以获取指定环境变量的值,并以字符串形式返回。
三、项目中用到的配置项
3.1、直接写在主脚本里
当你的程序很小的时候,可以直接把配置写在主脚本里
from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'some secret words'
app.config['DEBUG'] = True
app.config['ITEMS_PER_PAGE'] = 10
或者使用update方法,简化代码
from flask import Flask
app = Flask(__name__)
app.config.update(
DEBUG=True,
SECRET_KEY='some secret words',
ITEMS_PER_PAGE=10
)
3.1、单独写在一个配置文件里
程序逐渐变大时,配置也逐渐增多,写在主脚本里太占地方,不够优雅。我们可以创建一个单独的配置文件。和上面同样的配置。因为前面项目布局时分享过,project目录存储了整个项目的逻辑代码,所以我新增了一个config.py
在这个目录下:
# import os
# 基础配置,使用继承的方式
class BaseConfig:
TESTING = False
# MySQL所在主机名,默认127.0.0.1
HOSTNAME = "127.0.0.1"
# MySQL监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,自己设置
USERNAME = "root"
# 连接MySQL的密码,自己设置
PASSWORD = "root"
# MySQL上创建的数据库名称
DATABASE = "database_learn"
# 通过修改以下代码来操作不同的SQL比写原生SQL简单很多 --》通过ORM可以实现从底层更改使用的SQL
# app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
class DevelopmentConfig(BaseConfig):
# 开启debug
DEBUG = True
# mysql配置
HOSTNAME = "211.103.157.180"
PORT = 3310
USERNAME = "用户名"
PASSWORD = "密码"
DATABASE = "数据库名"
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
class ProductionConfig(BaseConfig):
DEBUG = False
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"
config = {
"development": DevelopmentConfig,
"production": ProductionConfig,
}
四、使用配置文件
通过from_object()方法导入配置
import os
# import logging
# from logging.handlers import TimedRotatingFileHandler
from flask import Flask
from project.config import config # 导入存储配置的字典
...
def create_app(config_name=None):
if config_name is None:
config_name = os.getenv('FLASK_ENV', 'development') # 从环境变量中获取FLASK_ENV,并设置默认值
app = Flask('project')
# setup config,导入配置,根据配置环境实例化对象
app.config.from_object(config[config_name])
...
return app
五、写在最后
宣传一波:大家若是有人想北京租房可以联系我,主要是物资学院、通州北关、北苑、草房的房子。(注:我不是中介哟,我也不打算转行做中介)