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中的属性。面说明本句

from app importroutes #本文无用

首先从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行代码)如下:

import os

class Config(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:

def from_object(self, obj):

if isinstance(obj, string_types):

obj = import_string(obj)

for key in dir(obj):

if key.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文件为:

import os
from dotenv importload_dotenv

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

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

microblog的程序,只有一行。

from app import app

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

app =Flask(__name__)

flask配置config详解的更多相关文章

  1. App.Config详解及读写操作

    App.Config详解及读写操作   App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而 ...

  2. App.Config详解

    App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是c ...

  3. c# App.Config详解

    c# App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序. 配置文件的根 ...

  4. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

  5. [转载]App.Config详解及读写操作

    App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是c ...

  6. 【和我一起学python吧】Python安装、配置图文详解

     Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...

  7. reids配置参数详解

    转自:http://www.jb51.net/article/60627.htm reids配置参数详解 #daemonize no  默认情况下, redis 不是在后台运行的,如果需要在后台运行, ...

  8. Dubbo配置方式详解

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次 ...

  9. Redis配置参数详解

    Redis配置参数详解 /********************************* GENERAL *********************************/ // 是否作为守护进 ...

  10. (转)App.Config详解及读写操作

    App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是c ...

随机推荐

  1. Logtxt

    public static void SSOAuthenLog(string msg, bool isRemoteAuthen = true)        {            #region  ...

  2. 匿名Lambda函数,C++

    1 // To Compile and Run: g++ -std=c++11 lambda.cc -Wall -O3 && ./a.out 2 3 4 #include <io ...

  3. vue使用echarts控制台报错Can't get DOM width or height并且地图显示超范围

    用echarts实现展示地图,但是地图显示的范围一直超出他那个div,同时报错. 完整报错信息: Can't get DOM width or height. Please check dom.cli ...

  4. 关于Lua中的面向对象实现

    写在前面 最近在琢磨"Lua热重载",在测试中发现我之前对Lua中的面向对象实现有一些理解发生变化,这里记录一下. 本文提到的面向对象实现来自云风. 类实现 <Lua程序设计 ...

  5. STM32F103使用FSMC对接正点原子3.5寸TFTLCD屏幕

    fsmc的使用算是32里面有点绕的一个知识点,但是想明白了其实也没啥了. 首先我先放32个0在这儿: 0000  0000  0000  0000  0000  0000  0000  0000 [3 ...

  6. Q:Win10无法访问共享文件夹。提示此用户无法登录,因为该账户当前已被禁用

    问题:当我访问同事电脑共享文件夹时,弹出如下提示框: 可以在命令提示符上ping通对方主机,但是不能访问对方文件夹 尝试解决方法(无效): 1.同时按住win+r打开运行命令框,输入gpedit.ms ...

  7. Node.js+Vue.js开发王者荣耀手机端官网

    一.项目初始 1.工具安装和环境搭建 node.js.npm.mongodb 编辑器:VScode 2.项目初始化 项目分为三个部分,分别是移动端界面.后台管理界面和node.js开发的整体的服务端 ...

  8. protobuf怎么处理java中的Object和Object[],protobuf的bytestring和object[]

    如题,作者一开始也遇到了这个比较棘手的问题. 话不多说,直接说解决方案. 这里使用bytestring,如果是object[]的话则用repeated定义即可. 那么问题又来了,用这个类型怎么做到与j ...

  9. 2.javaweb-begin

    1.回顾前端知识 1.CSS 1) CSS的角色:页面显示的美观风格 2) CSS的基础语法:标签样式:类样式:ID样式:组合样式:嵌入式样式表:内部样式表:外部样式表 3) 盒子模型:border. ...

  10. Windows快捷键学习

    Ctrl组合 Ctrl+C 复制 Ctrl+X 剪切 Ctrl+V 粘贴 Ctrl+A 全选 Ctrl+Z 撤消 Ctrl+S 保存 Shift组合 Shift+Delete 永久删除 Shift+A ...