用flask开发个人博客(26)—— 利用config.py配置文件动态的创建不同的Flask对象
原文:https://blog.csdn.net/hyman_c/article/details/52877704
对配置进行封装的目的是根据不同的使用场景,给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 clonegit@github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL26
用flask开发个人博客(26)—— 利用config.py配置文件动态的创建不同的Flask对象的更多相关文章
- 用flask开发个人博客(4)—— flask中4种全局变量
https://blog.csdn.net/hyman_c/article/details/53512109 一 current_app current_app代表当前的flask程序实例,使用时需 ...
- 用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Celery 将 Celery 加入到应用中 实现向新用户发 ...
- Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn)
Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn) 发布时间:2020-05-2413次浏览 前言 现在市面上又许多比较成熟的博客平台,例如:CSDN,博客园,新浪博客等!对于 ...
- 【技术博客】利用handler实现线程之间的消息传递
[技术博客]利用handler实现线程之间的消息传递 一.handler简介 在Android Studio的开发中,经常需要启动多个线程.比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃 ...
- 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- nodejs--express开发个人博客(-)
写完了入门笔记,开始进入开发阶段吧.基于上一节的内容,现在着手开发个人博客系统.先划分一下功能吧 /:首页 /login:登陆 /reg:注册 /post:发表文章 /logout:退出 首先规划一下 ...
- iOS开发优秀博客和软件推荐
iOSBlogAndTools iOS开发优秀博客和软件推荐 本博客和工具列表由广大iOS开发者收集和推荐,如果大家有好的博客或者工具想要分享请点击:我要提交. 收到大家的提交后会及时收录与更新.Gi ...
- Flask 学习 十 博客文章
提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...
- Django开发个人博客入门学习经验贴
[写在前面] 入门学习搭建个人博客系统首先还是参考大佬们的经验,记得刚入手Django的时候,一篇博客大佬说过一句话,做技术的不要一开始就扎头于细节中,先把握整体框架,了解这个对象之后再去了解细节,进 ...
随机推荐
- windows下 nginx安装 使用
介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器. 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络 ...
- hdu 2059 龟兔赛跑(动态规划DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) M ...
- Python代码这样写更优雅(转)
1.变量交换 大部分编程语言中交换两个变量的值时,不得不引入一个临时变量: >>> a = 1>>> b = 2>>> tmp = a>&g ...
- 线程,JSP,Servlet面试题
线程编程方面 60.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runna ...
- appium===登陆应用的案例
import time import os from appium import webdriver from selenium.webdriver.support.ui import WebDriv ...
- 64_c1
CBFlib-0.9.5.15-3.fc26.i686.rpm 05-Feb-2017 21:55 427710 CBFlib-0.9.5.15-3.fc26.x86_64.rpm 05-Feb-20 ...
- C++ Primer读书笔记
以前阅读学习C++ Primer时的习题代码(当时代码风格格式比较渣): https://github.com/liyuan989/exercise/tree/master/c%2B%2B%20pri ...
- 根据节点解析xml
config.xml文件如下: <?xml version="1.0" encoding="gb2312" ?> <root> < ...
- python库-urllib
urllib库提供了一系列操作url的功能,是python处理爬虫的入门级工具,网上的学习资料也很多.我做爬虫是一开始就用了Scrapy框架,并不是一步步从urllib开始的,反而是在后来解决一些小问 ...
- jQuery 中的 unbind() 方法
jQuery 中的 unbind() 方法是 bind() 方法的反向操作,从每一个匹配的元素中删除绑定的事件. 语法结构: unbind([type][, data]); type是事件类型,dat ...