📋 个人简介
- 💖 作者简介:大家好,我是阿牛。
- 📝 博主的个人网站:阿牛的博客小屋🔥
- 💬格言:迄今所有人生都大写着失败,但不妨碍我继续向前!🔥
前言
上一节我们用flask搭建了helloworld程序,那么这节我们来说一下参数的问题,然后再学习一下Flask工程配置的加载方式。
Flask对象初始化参数
Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下
Flask 应用程序在创建的时候一些需要我们关注的参数:
- import _ name
Flask 程序所在的包(模块),传 __name__就可以
其可以决定 Flask 在访问静态文件时查找的路径,也就是说,通过这个参数,可以定位到当前文件所在的项目文件夹(即根目录),然后就可以访问根目录下的静态资源啦!。- static _ folder
静态文件存储的文件夹,可以不传,默认为 static,在项目文件夹下创建对应的静态文件夹,然后将文件夹名传到这里。
- template _ folder
模板文件存储的文件夹,可以不传,默认为 templates ,在项目文件夹下创建对应的模板文件夹,然后将文件夹名传到这里。- static url path
静态文件访问路径,可以不传,默认为:/+ static folder ,所有默认情况下则为/static,你可以通过static url _ path 参数将/staic简写为/s等等,自己自定义就好。
默认情况下
app = Flask (\_\_name__)。
而在django中,这些静态资源路径全部集成在settings.py文件中,你只需在settings中设置好静态资源路径即可。
#导入Flask类
from flask import Flask
#Flask类接受一个参数__name__
app = Flask(import_name=__name__,static_folder='static',template_folder='templates',static_url_path='/s')
#装饰器的作用是将路由映射到视图函数index,这里‘/’代表根目录
@app.route('/')
def index():
return 'helloworld'
# Flask应用程序的run方法启动web服务器
if __name__ == '__main__':
app.run()
如图,我成功地访问到了/static(路径别名为/s)的图片。
run()方法的参数
启动app.py程序后,系统默认的是 http://127.0.0.1:5000/,那么我们如何修改里面的数据呢,例如端口号、主机名怎么设定呢,这时我们可以在app.run()中传递参数,其代码如下:app.run(host=None,port=None,debug=None,load_dotenv=True)
其中:
host:ip地址,将此设置为“0.0.0.0”,以让服务器在外部也可以访问,默认为127.0.0.1;
port:Web服务器的端口,一个端口号对应一个程序,默认值为5000;
debug:调试模式,当debug=True时,只要代码改变,当你刷新页面时服务器就会重新加载最新的代码,适用于开发环境,默认为Flase,适用于产品环境;
load_dotenv:加载最近的文件.env和文件.flaskenv,用于设置环境变量的文件,也会改变工作环境,目录到包含找到的第一个文件的目录,默认为True;
Flask工程配置的加载方式
使用方式
Django 将所有配置信息都放到了 settings.py 文件中,而 Flask 则不同。
Flask 将配置信息保存到了 app.config 属性中,该属性可以按照字典类型进行操作。
读取
app.config.get (name)
app.config [name]
工程配置三种加载方式
主要使用以下三种方式:
从配置对象中加载
app.config.from_object(配置对象)
#导入Flask类
from flask import Flask
# 配置对象
class DefaultConfig(object):
SECERT_KEY = 'wudnmjwsjj17djmsdji'
#Flask类接受一个参数__name__
app = Flask(import_name=__name__,static_folder='static',template_folder='templates',static_url_path='/s')
# 从配置对象中加载
app.config.from_object(DefaultConfig)
#装饰器的作用是将路由映射到视图函数index,这里‘/’代表根目录
@app.route('/')
def index():
print(app.config['SECERT_KEY'])
return 'helloworld'
# Flask应用程序的run方法启动web服务器
if __name__ == '__main__':
app.run()
应用场景:
作为默认配置写在程序代码中
从配置文件中加载
app.config.from_pyfile(配置对象)
在当前项目下新建一个配置文件settings.py
SECERT_KEY = 'wudnmjwsjj17djmsdji'
在Flask程序中
#导入Flask类
from flask import Flask
#Flask类接受一个参数__name__
app = Flask(import_name=__name__,static_folder='static',template_folder='templates',static_url_path='/s')
# 从配置文件中加载
app.config.from_pyfile('settings.py')
#装饰器的作用是将路由映射到视图函数index,这里‘/’代表根目录
@app.route('/')
def index():
print(app.config['SECERT_KEY'])
return 'helloworld'
# Flask应用程序的run方法启动web服务器
if __name__ == '__main__':
app.run()
应用场景:
在项目中使用固定的配置文件
从环境变量中加载
环境变量( environment variables )一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。
==通俗的理解,环境变量就是我们设置在操作系统中,由操作系统代为保存的变量值==
Flask 使用环境变量加载配置的本质是通过环境变量找到配置文件,再读取配置文件的信息,其使用方式为:
app.config.fron_envvar('环境变量名',[silent])
关于silent的说明:
表示系统环境变量中没有设置相应值时是否抛出异常
- False 表示不安静的处理,没有值时报错通知,默认为False
- True 表示安静的处理,即时没有值也让Flask正常的运行下去
这里我以windows系统为例,做一个在pycharm中设置环境变量的演示:
上图所示,我已添加好了用户环境变量,当然你也可以用其他方式设置环境变量,这里我不再说明,小伙伴们自己去了解。
#导入Flask类
from flask import Flask
#Flask类接受一个参数__name__
app = Flask(import_name=__name__,static_folder='static',template_folder='templates',static_url_path='/s')
# 从环境变量中加载
app.config.from_envvar('KEY')
#装饰器的作用是将路由映射到视图函数index,这里‘/’代表根目录
@app.route('/')
def index():
print(app.config['SECERT_KEY'])
return 'helloworld'
# Flask应用程序的run方法启动web服务器
if __name__ == '__main__':
app.run()
特别注意,因为这里是我在pycharm中设置的环境变量,不是全局环境变量,所以运行方式只能用pycharm的运行方式,不能再用终端的python +py文件名 指令了(你可以在终端设置局部环境变量或者直接设置一个全局环境变量)。
总结
从配置对象中加载:
- 优点 - 继承,复用
- 缺点 - 敏感数据暴露
从配置文件中加载:
- 优点 - 独立文件,保护敏感数据
- 缺点 - 不能继承
从环境变量中加载:
- 优点 - 独立文件,保护敏感数据,文件路径不固定,灵活
- 缺点 - 不方便,要设置环境变量
通过上面的实践,我们要了解到,从环境变量中加载和从文件中加载本质上是一样的,只不过从配置文件中加载是文件路径在代码中是写死的,而从环境变量中加载是我们把配置文件路径保存到了一个系统变量中。我们在开发中一般会采用从环境变量中加载或者从环境变量中加载和从配置对象中加载相结合的方式,因为配置文件中放的是我们很重要的项目信息,我们一般为了防止别人访问到我们的配置信息,会将settings.py放到其他位置(项目外),然后用环境变量来记录路径,从而保证我们的项目安全。
将Flask配置方式封装成工厂函数
项目中的常用方式
使用工厂模式创建 Flask app ,并结合使用配置对象与环境变量加载配置
- 使用配置对象加载默认配置
- 使用环境变量加载不想出现在代码中的敏感配置信息
#导入Flask类
from flask import Flask
# 从配置对象中加载的默认配置
class DefaultConfig(object):
SECERT_KEY = 'jstwn63bng'
# 创建Flask项目的工厂函数
def create_flask_app(config):
app = Flask(__name__)
app.config.from_object(config)
#从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数
app.config.from_envvar("KEY",silent=True)
return app
# 创建项目
app = create_flask_app(DefaultConfig)
#装饰器的作用是将路由映射到视图函数index,这里‘/’代表根目录
@app.route('/')
def index():
print(app.config['SECERT_KEY'])
return 'helloworld'
# Flask应用程序的run方法启动web服务器
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8000,debug=True)
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。