摘要:中的配置,都是通過來控制那么究竟是什么再來看函數(shù)而是什么再轉向看的源碼,可以看到類繼承于字典也就是說的就是一個特殊的字典,用于保存配置項。
config
flask中的配置,都是通過config來控制
那么config究竟是什么?
self.config = self.make_config(instance_relative_config)
再來看make_config函數(shù):
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的約定,實現(xiàn)一個擴展主要與兩個部分有關:
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執(zhí)行過程:
1.添加配置項
2.在extension中添加對象
app.extensions["sqlalchemy"] = _SQLAlchemyState(self)
3.添加@app.teardown_appcontext
app.teardown_appcontext是teardown_X() 回調函數(shù)用于銷毀資源
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
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/41209.html
摘要:解決過程關于什么是是一個上被廣泛使用的高性能的。和大多數(shù)的框架兼容,并具有實現(xiàn)簡單,輕量級,高性能等特點。為了解決這個問題,在實例化對象的時候要加上參數(shù)。參考用來,能否長連接連接從未發(fā)布和在上使用 問題描述 使用Flask開發(fā)的Web服務,部署在服務器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,說瀏覽器崩了,當時急急忙忙的重啟,...
摘要:解決過程關于什么是是一個上被廣泛使用的高性能的。和大多數(shù)的框架兼容,并具有實現(xiàn)簡單,輕量級,高性能等特點。為了解決這個問題,在實例化對象的時候要加上參數(shù)。參考用來,能否長連接連接從未發(fā)布和在上使用 問題描述 使用Flask開發(fā)的Web服務,部署在服務器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,說瀏覽器崩了,當時急急忙忙的重啟,...
摘要:所以這就現(xiàn)實了在中使用的應用上下文。要引入請求上下文,需要考慮這兩個問題如何在中產(chǎn)生請求上下文。中有和可以產(chǎn)生請求上下文。具體的思路還是在中重載類,通過,在的上下文環(huán)境下執(zhí)行。將他們傳入,生成偽造的請求上下文可以覆蓋大多數(shù)的使用情況。 其實我只是想把郵件發(fā)送這個動作移到Celery中執(zhí)行。既然用到了Celery,那么每次發(fā)郵件都單獨開一個線程似乎有點多余,異步任務還是交給Celery吧...
閱讀 727·2021-11-22 13:52
閱讀 1537·2021-09-27 13:36
閱讀 2840·2021-09-24 09:47
閱讀 2199·2021-09-22 15:48
閱讀 3612·2021-09-22 15:39
閱讀 1478·2019-08-30 12:43
閱讀 2930·2019-08-29 18:39
閱讀 3201·2019-08-29 12:51