摘要:中的配置,都是通过来控制那么究竟是什么再来看函数而是什么再转向看的源码,可以看到类继承于字典也就是说的就是一个特殊的字典,用于保存配置项。
config
flask中的配置,都是通过config来控制
那么config究竟是什么?
self.config = self.make_config(instance_relative_config)
再来看make_config函数:
def make_config(self, instance_relative=False): root_path = self.root_path if instance_relative: root_path = self.instance_path return self.config_class(root_path, self.default_config)
而config_class是什么?
config_class = Config
再转向看config的源码,可以看到Config类继承于字典:
class Config(dict):
也就是说flask的config就是一个特殊的字典,用于保存配置项。
extensionflask是一个微框架,需要使用插件来扩展功能,那么扩展的原理是什么呢?
扩展程序需要与flask交互就需要一种类似wsgi的约定,实现一个扩展主要与两个部分有关:
1.config
2.应用上下文
以广泛应用的flask_sqlalchemy为例,看一下整个过程:
(1)初始化
def __init__(self, app=None, use_native_unicode=True, session_options=None,metadata=None, query_class=BaseQuery, model_class=Model): ... self.app = app ...
(2)调用init_app
db = SQLAlchemy() def create_app(): app = Flask(__name__) db.init_app(app) return app
(3)init_app执行过程:
1.添加配置项
2.在extension中添加对象
app.extensions["sqlalchemy"] = _SQLAlchemyState(self)
3.添加@app.teardown_appcontext
app.teardown_appcontext是teardown_X() 回调函数用于销毁资源
def init_app(self, app): if ( "SQLALCHEMY_DATABASE_URI" not in app.config and "SQLALCHEMY_BINDS" not in app.config ): warnings.warn( "Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. " "Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:"." ) app.config.setdefault("SQLALCHEMY_DATABASE_URI", "sqlite:///:memory:") app.config.setdefault("SQLALCHEMY_BINDS", None) app.config.setdefault("SQLALCHEMY_NATIVE_UNICODE", None) app.config.setdefault("SQLALCHEMY_ECHO", False) app.config.setdefault("SQLALCHEMY_RECORD_QUERIES", None) app.config.setdefault("SQLALCHEMY_POOL_SIZE", None) app.config.setdefault("SQLALCHEMY_POOL_TIMEOUT", None) app.config.setdefault("SQLALCHEMY_POOL_RECYCLE", None) app.config.setdefault("SQLALCHEMY_MAX_OVERFLOW", None) app.config.setdefault("SQLALCHEMY_COMMIT_ON_TEARDOWN", False) track_modifications = app.config.setdefault( "SQLALCHEMY_TRACK_MODIFICATIONS", None ) if track_modifications is None: warnings.warn(FSADeprecationWarning( "SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and " "will be disabled by default in the future. Set it to True " "or False to suppress this warning." )) app.extensions["sqlalchemy"] = _SQLAlchemyState(self) @app.teardown_appcontext def shutdown_session(response_or_exc): if app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]: if response_or_exc is None: self.session.commit() self.session.remove() return response_or_exc
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41209.html
摘要:解决过程关于什么是是一个上被广泛使用的高性能的。和大多数的框架兼容,并具有实现简单,轻量级,高性能等特点。为了解决这个问题,在实例化对象的时候要加上参数。参考用来,能否长连接连接从未发布和在上使用 问题描述 使用Flask开发的Web服务,部署在服务器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,说浏览器崩了,当时急急忙忙的重启,...
摘要:解决过程关于什么是是一个上被广泛使用的高性能的。和大多数的框架兼容,并具有实现简单,轻量级,高性能等特点。为了解决这个问题,在实例化对象的时候要加上参数。参考用来,能否长连接连接从未发布和在上使用 问题描述 使用Flask开发的Web服务,部署在服务器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,说浏览器崩了,当时急急忙忙的重启,...
摘要:所以这就现实了在中使用的应用上下文。要引入请求上下文,需要考虑这两个问题如何在中产生请求上下文。中有和可以产生请求上下文。具体的思路还是在中重载类,通过,在的上下文环境下执行。将他们传入,生成伪造的请求上下文可以覆盖大多数的使用情况。 其实我只是想把邮件发送这个动作移到Celery中执行。既然用到了Celery,那么每次发邮件都单独开一个线程似乎有点多余,异步任务还是交给Celery吧...
阅读 678·2021-11-22 13:52
阅读 1482·2021-09-27 13:36
阅读 2791·2021-09-24 09:47
阅读 2106·2021-09-22 15:48
阅读 3561·2021-09-22 15:39
阅读 1424·2019-08-30 12:43
阅读 2895·2019-08-29 18:39
阅读 3145·2019-08-29 12:51