原文:https://blog.csdn.net/hyman_c/article/details/52877704

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


config.py代码如下:
      
  1.  
    import os
  2.  
    basedir = os.path.abspath(os.path.dirname(__file__))
  3.  
     
  4.  
    class Config:
  5.  
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
  6.  
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
  7.  
    FLASKY_MAIL_SUBJECT_PREFIX='[Flasky]'
  8.  
    FLASKY_MAIL_SENDER = '879651072@qq.com'
  9.  
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
  10.  
     
  11.  
    @staticmethod
  12.  
    def init_app(app):
  13.  
    pass
  14.  
     
  15.  
    class DevelopmentConfig(Config):
  16.  
    DEBUG = True
  17.  
    MAIL_SERVER = 'smtp.qq.com'
  18.  
    MAIL_PORT = 587
  19.  
    MAIL_USE_TLS = True
  20.  
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
  21.  
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
  22.  
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URI') or \
  23.  
    'sqlite:///' + os.path.join(basedir,'data-dev.sqlite')
  24.  
     
  25.  
    class TestingConfig(Config):
  26.  
    TESTING = True
  27.  
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URI') or \
  28.  
    'sqlite:///' + os.path.join(basedir,'data-test.sqlite')
  29.  
     
  30.  
    class ProductionConfig(Config):
  31.  
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or \
  32.  
    'sqlite:///' + os.path.join(basedir,'data.sqlite')
  33.  
     
  34.  
    config={
  35.  
    'development':DevelopmentConfig,
  36.  
    'testing':TestingConfig,
  37.  
    'Production':ProductionConfig,
  38.  
    'default':DevelopmentConfig
  39.  
    }


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

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

  1.  
    from flask import Flask,render_template
  2.  
    from flask.ext.bootstrap import Bootstrap
  3.  
    from flask.ext.mail import Mail
  4.  
    from flask.ext.moment import Moment
  5.  
    from flask.ext.sqlalchemy import SQLAlchemy
  6.  
    from config import config
  7.  
     
  8.  
    bootstrap=Bootstrap()
  9.  
    mail=Mail()
  10.  
    moment=Moment()
  11.  
    db=SQLAlchemy()
  12.  
     
  13.  
    def create_app(config_name):
  14.  
    app=Flask(__name__)
  15.  
    app.config.from_object(config[config_name])
  16.  
    config[config_name].init_app(app)
  17.  
     
  18.  
    bootstrap.init_app(app)
  19.  
    mail.init_app(app)
  20.  
    moment.init_app(app)
  21.  
    db.init_app(app)
  22.  
     
  23.  
    from .main import main as main_blueprint
  24.  
    app.register_blueprint(main_blueprint)
  25.  
    return app


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

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

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

  1.  
    class Myobj:
  2.  
    name='hyman'


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

  1.  
    def from_object:
  2.  
    if isinstance(obj, string_types):
  3.  
    obj = import_string(obj)
  4.  
    for key in dir(obj):
  5.  
    if key.isupper():
  6.  
    self[key] = getattr(obj, key)

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

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


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

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

  1. 用flask开发个人博客(4)—— flask中4种全局变量

    https://blog.csdn.net/hyman_c/article/details/53512109 一  current_app current_app代表当前的flask程序实例,使用时需 ...

  2. 用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Celery 将 Celery 加入到应用中 实现向新用户发 ...

  3. Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn)

    Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn) 发布时间:2020-05-2413次浏览 前言 现在市面上又许多比较成熟的博客平台,例如:CSDN,博客园,新浪博客等!对于 ...

  4. 【技术博客】利用handler实现线程之间的消息传递

    [技术博客]利用handler实现线程之间的消息传递 一.handler简介 在Android Studio的开发中,经常需要启动多个线程.比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃 ...

  5. 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  6. nodejs--express开发个人博客(-)

    写完了入门笔记,开始进入开发阶段吧.基于上一节的内容,现在着手开发个人博客系统.先划分一下功能吧 /:首页 /login:登陆 /reg:注册 /post:发表文章 /logout:退出 首先规划一下 ...

  7. iOS开发优秀博客和软件推荐

    iOSBlogAndTools iOS开发优秀博客和软件推荐 本博客和工具列表由广大iOS开发者收集和推荐,如果大家有好的博客或者工具想要分享请点击:我要提交. 收到大家的提交后会及时收录与更新.Gi ...

  8. Flask 学习 十 博客文章

    提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...

  9. Django开发个人博客入门学习经验贴

    [写在前面] 入门学习搭建个人博客系统首先还是参考大佬们的经验,记得刚入手Django的时候,一篇博客大佬说过一句话,做技术的不要一开始就扎头于细节中,先把握整体框架,了解这个对象之后再去了解细节,进 ...

随机推荐

  1. 深入理解 JavaScript(五)

    根本没有“JSON 对象”这回事! 前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为 JSON 对象,把 JSON 对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下 ...

  2. web-project 故障修复功能 传递所有的event_id数据到后台

    <script language=javascript> function IdentifyRepair(event_id) { var url; url = "/View/fa ...

  3. perl输出重定向

    use utf8; open A, ">&STDOUT"; open STDOUT, ">AA.txt"; print STDOUT 'AB ...

  4. 【Sqlite3】sqlite_sequence表(转)

    sqlite_sequence表也是SQLite的系统表.该表用来保存其他表的RowID的最大值.数据库被创建时,sqlite_sequence表会被自动创建.该表包括两列.第一列为name,用来存储 ...

  5. Caffe学习笔记3

    Caffe学习笔记3 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和h ...

  6. Vue-$emit的用法

    1.父组件可以使用 props 把数据传给子组件.2.子组件可以使用 $emit 触发父组件的自定义事件. vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( ev ...

  7. centos_7.1.1503_src_1

    http://vault.centos.org/7.1.1503/os/Source/SPackages/ 389-ds-base-1.3.3.1-13.el7.src.rpm 31-Mar-2015 ...

  8. 用selenium 模块控制浏览器

    11.8 用selenium 模块控制浏览器selenium 模块让Python 直接控制浏览器,实际点击链接,填写登录信息,几乎就像是有一个人类用户在与页面交互.与Requests 和Beautif ...

  9. 项目评审ppt的纲要

    1.prd不能模糊,产品的问题全部明确 2.收益在哪里 3.设计体现业务4.怎样保证数据的前后协作5.异常如何处理6.技术解决的痛点7.对外部依赖8.性能指标预期(响应时间)9.

  10. 设计模式之笔记--单例模式(Singleton)

    单例模式(Singleton) 定义 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点. 类图 描述 类Singleton的构造函数的修饰符为private,防止用 ...