用flask开发个人博客(26)—— 利用config.py配置文件动态的创建不同的Flask对象

        对配置进行封装的目的是根据不同的使用场景,给flask的app赋予不同的config,最经典的用法就是把开发、测试和生成分开,通过配置文件使用不同的数据库。

config.py代码如下:
     
import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FLASKY_MAIL_SUBJECT_PREFIX='[Flasky]'
    FLASKY_MAIL_SENDER = '879651072@qq.com'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')

    @staticmethod
    def init_app(app):
        pass

class DevelopmentConfig(Config):
    DEBUG = True
    MAIL_SERVER = 'smtp.qq.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URI') or \
            'sqlite:///' + os.path.join(basedir,'data-dev.sqlite')

class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URI') or \
            'sqlite:///' + os.path.join(basedir,'data-test.sqlite')

class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or \
            'sqlite:///' + os.path.join(basedir,'data.sqlite')

config={
        'development':DevelopmentConfig,
        'testing':TestingConfig,
        'Production':ProductionConfig,
        'default':DevelopmentConfig
        }

        现在来分析一下整个config.py的代码结构,首先定义了一个基类Config,该类中包含了在开发,测试和生产配置都需要的基本配置,其中包包括预防CSRF的密钥、设置数据库自动commit的选项等等,其他开发、测试和生产配置分别从Config继承,主要区别在于配置的数据库路径不一样。

          最后定义了一个config的字典,作为外部调用这些配置的接口。下面我们看下怎么去调用这些配置,这里我先引入了app/__init__.py这个app包的构造文件:

from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
from flask.ext.mail import Mail
from flask.ext.moment import Moment
from flask.ext.sqlalchemy import SQLAlchemy
from config import config

bootstrap=Bootstrap()
mail=Mail()
moment=Moment()
db=SQLAlchemy()

def create_app(config_name):
    app=Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)
    return app

    请注意下面这三行代码,第一行是从我们定义的config.py中引入config这个字典;第二行是通过config_name获取不同的Config子类对象,app.config的from_object函数会对返回的Config对象的子类提取相关属性和值,稍后我会详细分析下这个方法;第三行调用init_app()这个静态方法对app进行其他的操作,但是我们这里用了pass,并没有做实际的操作。到此为止,只用了三行代码便实现了对config的调用。

from config import config
app.config.from_object(config[config_name])
config[config_name].init_app(app)

        下面我分析下app.config.from_object()这个函数,最开始时为了测试这个函数的作用,我定义了下面的类:

class Myobj:
    name='hyman'

        调用app.config.from_object(Myobj)的方法,发现app的config中并没有正确引入name并赋值‘hyman’,后面查看了它的源代码():

def from_object:
if isinstance(obj, string_types):
            obj = import_string(obj)
        for key in dir(obj):
            if key.isupper():
                self[key] = getattr(obj, key)
        发现了原来他有if key.isupper()的判断,也就是说必须是大写字母的属性它才会进行引入,它引入的方法就是调用通过python标准的api getattr()函数,将Myobj的属性改成大写后读取Myobj的NAME属性并获取其值正常。


Github位置:
https://github.com/HymanLiuTS/flaskTs

克隆本项目:
git clone git@github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL26

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值