flask配置文件config方法详解

   

    flask系列讲座与2017年12月6日开始,每周一篇。第三篇其中讲述flask的配置方法。使用app.config.from_object()方法,似乎很神奇。如果明白背后逻辑,实际上很自然。涉及代码没有几行,背后逻辑涉及的代码也只有几行。

都说python简洁,这篇大概具有一定的典型性。简洁是指程序代码少,并不一定是含义少。

本文flask的配置文件涉及config的文件均放在microblog的文件夹中,共有两个模块:

        子文件夹app中的__init__.py

        config.py

文件结构如下:

microblog\                              项目文件夹
   
app\                       名为app的package
        __init__.py            初始化模块,5行代码
        ......
    config.py                  config模块,3行代码
    microblog.py               microblog模块,1行代码

此两个模块共8行代码,另外一个模块microblog.py中,只有一行代码,引用了app。本文涉及的代码共9行

__init__.py的代码(5行代码)如下:

from flask import Flask     #引入Flask
from config import Config   #第1个config,引入Config类

app = Flask(__name__)       #创建Flask的实例app
app.config.from_object(Config)#第2个config是Flask中的属性。面说明本句


fromappimportroutes     #本文无用

    首先从flask引入Flask类。

    从本项目的config(第1个config)模块中,引入Config类。

    按生成Flask的惯例,创建实例app。

    Flask有属性config(第2个config),此属性是一个Config类,有方法from_object,可以用dir(app.config)查到。在后面会介绍。

    注意本段代码中,此两个config是不同的对象,在flask的介绍中,经常出现同名的不同对象。

    传入from_object的参数是引入Config类。类也是对象,可以当参数传递。

 

Config类在config模块中定义(共3行代码)如下:

importos

 

classConfig(object):

   SECRET_KEY = os.environ.get('SECRET_KEY')or'you-will-never-guess'

在Config的类,含有类属性SECRET_KEY。

这里也有两个同名的不同对象,左面SECRET_KEY是调用os.environ.get返回的对象,作为Config类的类变量,中间SECRET_KEY是调用os.environ.get时,代入以字符串的形式表示的参数。os.environ是一个存取环境变量的类,环境变量的值用get方法获取,本例是获取名称为'SECRET_KEY'环境变量的值。

    os.environ,也可以看作字典变量,例如当环境变量'SECRET_KEY'存在时,可以使用os.environ['SECRET_KEY']。

    当环境变量'SECRET_KEY'可能不存在,则可使用字典的get方法,以提供当环境变量的确不存在时,默认的返回值。可使用两种方式提供默认值,一种是上例中使用操作符or:当or之前的运算结果不为空字符时,运算结果为or之前的运算结果,否则为or之后的结果。所以当没有此名字的环境变量时,有:

>>>os.environ.get('SECRET_KEY','you-will-never-guess')
'you-will-never-guess'

也可使用字典变量的get方法,提供默认值:

>>>SECRET_KEY = os.environ.get('SECRET_KEY','you-will-never-guess')

>>>SECRET_KEY

'you-will-never-guess'

 

现在解释__init__.py中的

app.config.from_object(Config)

首先注意builtins中的(可点击)dir的功能是列出的所有可见的属性。

return analphabetized list of names comprising (some of) the attributes

of the givenobject, and of attributes reachable from it.

现在可以看flask\from_object:

deffrom_object(self,obj):

   ifisinstance(obj,string_types):

       obj = import_string(obj)

   forkeyindir(obj):

       ifkey.isupper():

           self[key]=getattr(obj,key)

本例传送的obj是Config类,不是字符串,因此isinstance(obj,string_tupes)为False,而不会根据字符串引入对象。

然后Config的所有属性,如果是大写的,将被存入以self为名字的字典中,即本例为app.config为名字的字典中。

执行文中的验证为:

>>>from microblog import app
>>>app.config['SECRET_KEY']
'you-will-never-guess'

环境变量的设置与所用的系统相关,可以百度“环境变量的设置 python”,但举的例子都是对名称为path的环境变量进行设置,相信都熟悉。但本例是对名称为SECRET_KEY的环境变量进行设置。对于window,如果设置过虚拟环境venv,也可以如下设置

set SECRET_KEY="12345678"

执行文中的验证结果为:

>>>from microblog import app
>>>app.config['SECRET_KEY']
'12345678'

为密码安全,一般使用后缀为.env的文件,设置密码,

相应修改config文件为:

importos
fromdotenvimportload_dotenv

basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(basedir
,'.env'))

classConfig(object):
   
SECRET_KEY = os.environ.get('SECRET_KEY')or'you-will-never-guess'

 

microblog的程序,只有一行。

fromappimportapp

第一个app是pakeage,即app文件夹所包含的pakeage,后一个app是flask的实例,在__init__中的那个app:

app =Flask(__name__)

 

附:

flask的第一篇的URL如下,每篇前面都有所有目录:

https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world


版权声明:本文为weixin_42102783原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。