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

Posted 南枝向暖北枝寒MA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了app.run 相关参数 & flask配置文件相关的知识,希望对你有一定的参考价值。

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

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

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 模块中定义的参数导进来。

知识点:模块的路径

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

以上是关于app.run 相关参数 & flask配置文件的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

创建Flask实例对象时的参数和app.run()中的参数

Flask基础

Flask 启动时的源码简析