app.run 相关参数 & flask配置文件

要想接受外网的访问以及使用非默认端口访问,可以给 ​​run​​​ 函数传入 ​​host​​​ 和 ​​port​​ 两参数。

app.run(debug=True, host='0.0.0.0', port=8800)

这样就可以实现了,但是还存在一个问题,​​debug=True​​ 是在开发环境使用,在生产环境是不合适的,那么怎么解决这一问题,那就是配置文件。

Flask对于配置文件,没有特别的位置约束和名字约束,约定俗成,配置文件放在项目目录下,名字叫 ​​config.py​​ 。

config.py

DEBUG = True

fisher.py

from flask import Flask
from config import DEBUG

app = Flask(__name__)


def hello():
# 另一种 基于类的视图(也叫即插视图)
return 'Hello, lulu'


app.add_url_rule('/hello/', view_func=hello)

app.run(debug=DEBUG, host='0.0.0.0', port=8800)

要是配置文件的参数过多时,上述的方式不好,可以采用下面的方式:

app 核心对象提供了一个属性 ​​config​​​,可以把 ​​config.py​​ 模块中定义的参数导进来。

知识点:模块的路径

app.run 相关参数 & flask配置文件_python

from flask import Flask

app = Flask(__name__)
# 载入整个配置文件
app.config.from_object('config') # from_object需要接收模块的路径


def hello():
# 另一种 基于类的视图(也叫即插视图)
return 'Hello, lulu'


app.add_url_rule('/hello/', view_func=hello)
if __name__ == '__main__':
# 生产环境 nginx + uwsgi服务器
# 访问配置参数 因为app.config是dict的子类
app.run(debug=app.config['DEBUG'], host='0.0.0.0', port=8800)

关于 ​​__name__ == '__main__'​

如果我们在入口文件中增加了这样的一个判断之后,我们能够确保,if 里的语句,只在入口文件里执行。如果说我们当前的 fisher 这个文件,它不是作为入口文件直接被执行的,而是被其他的模块导入的,那么下面的这个 ​​app.run()​​ 是不会执行的,这个大家都是知道的。但是我的问题是具体到我们 flask 的项目里面,在入口文件里面增加这样的一个判断,然后再启动我们的 web 服务器,到底有什么具体的意义吗?

我们之前给大家讲到过了,我们在开发环境下,启动的 web 服务器是 flask 自带的一个非常简单的服务器,但是如果我们要把这个项目部署到生产环境的时候,我们通常是不会使用 flask 自带的这个服务器的。那么在生产环境下部署项目的时候,我们需要使用 ​​nginx + uwsgi​​​ 这样的一个组合来部署项目,nginx 作为前置服务器用来接收我们浏览器发来的请求,接着会把这个请求转发给我们的 uwsgi 。在生产环境下,flask 这个项目的启动并不是像我们这样 ​​python3.6 fisher.py​​​ 手动来执行的, 而是由 uwsgi 加载 fisher 这个模块来启动 flask 相关代码。那么在生产环境下面,fisher 这个文件就不再是入口文件,它只是一个被 uwsgi 加载的模块文件,所以说在生产环境下,​​app.run()​​​ 是根本就不会被执行的。那么我们可以反过来看一下,如果说我们没有了这个 if 判断,在生态环境下一旦加载了 fisher 这个文件之后,​​app.run()​​ 就会执行,我们已经有了 uwsgi 作为我们的 web 服务器,而在这种情况下我们又启动了 flask 的内置的 web 服务器,这个是不可以的。但是如果我们加了这个 if 判断之后就不一样了,它可以保证我们在生产环境下不会启动 flask 自带的服务器。

踩坑

如果采用from_object方式载入配置文件,配置文件中配置项必须全大写,如果有类似这样 ​​Debug = True​​​ 的写法(配置文件中),会忽略,不会载入,所以使用 ​​app.config['Debug']​​​ 时会报 ​​KeyError​​​ 。但是打印 ​​app.config['DEBUG']​​​ 的值确是 ​​False​​​ ,是因为 ​​DEBUG​​​ 在 flask 中是默认参数,默认值是 ​​False​​ 。