国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入理解flask框架(3):config與extension

wmui / 3430人閱讀

摘要:中的配置,都是通過(guò)來(lái)控制那么究竟是什么再來(lái)看函數(shù)而是什么再轉(zhuǎn)向看的源碼,可以看到類繼承于字典也就是說(shuō)的就是一個(gè)特殊的字典,用于保存配置項(xiàng)。

config

flask中的配置,都是通過(guò)config來(lái)控制
那么config究竟是什么?

self.config = self.make_config(instance_relative_config)

再來(lái)看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

再轉(zhuǎn)向看config的源碼,可以看到Config類繼承于字典:

class Config(dict):

也就是說(shuō)flask的config就是一個(gè)特殊的字典,用于保存配置項(xiàng)。

extension

flask是一個(gè)微框架,需要使用插件來(lái)擴(kuò)展功能,那么擴(kuò)展的原理是什么呢?
擴(kuò)展程序需要與flask交互就需要一種類似wsgi的約定,實(shí)現(xiàn)一個(gè)擴(kuò)展主要與兩個(gè)部分有關(guān):
1.config
2.應(yīng)用上下文
以廣泛應(yīng)用的flask_sqlalchemy為例,看一下整個(gè)過(guò)程:
(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)調(diào)用init_app

        db = SQLAlchemy()
        def create_app():
            app = Flask(__name__)
            db.init_app(app)
            return app

(3)init_app執(zhí)行過(guò)程:
1.添加配置項(xiàng)
2.在extension中添加對(duì)象

app.extensions["sqlalchemy"] = _SQLAlchemyState(self)

3.添加@app.teardown_appcontext
app.teardown_appcontext是teardown_X() 回調(diào)函數(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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41209.html

相關(guān)文章

  • Gunicron + gevent Mongodb數(shù)據(jù)庫(kù)連接一直增加不釋放

    摘要:解決過(guò)程關(guān)于什么是是一個(gè)上被廣泛使用的高性能的。和大多數(shù)的框架兼容,并具有實(shí)現(xiàn)簡(jiǎn)單,輕量級(jí),高性能等特點(diǎn)。為了解決這個(gè)問(wèn)題,在實(shí)例化對(duì)象的時(shí)候要加上參數(shù)。參考用來(lái),能否長(zhǎng)連接連接從未發(fā)布和在上使用 問(wèn)題描述 使用Flask開(kāi)發(fā)的Web服務(wù),部署在服務(wù)器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,說(shuō)瀏覽器崩了,當(dāng)時(shí)急急忙忙的重啟,...

    Yujiaao 評(píng)論0 收藏0
  • Gunicron + gevent Mongodb數(shù)據(jù)庫(kù)連接一直增加不釋放

    摘要:解決過(guò)程關(guān)于什么是是一個(gè)上被廣泛使用的高性能的。和大多數(shù)的框架兼容,并具有實(shí)現(xiàn)簡(jiǎn)單,輕量級(jí),高性能等特點(diǎn)。為了解決這個(gè)問(wèn)題,在實(shí)例化對(duì)象的時(shí)候要加上參數(shù)。參考用來(lái),能否長(zhǎng)連接連接從未發(fā)布和在上使用 問(wèn)題描述 使用Flask開(kāi)發(fā)的Web服務(wù),部署在服務(wù)器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,說(shuō)瀏覽器崩了,當(dāng)時(shí)急急忙忙的重啟,...

    Taste 評(píng)論0 收藏0
  • 在Celery中使用Flask的上下文

    摘要:所以這就現(xiàn)實(shí)了在中使用的應(yīng)用上下文。要引入請(qǐng)求上下文,需要考慮這兩個(gè)問(wèn)題如何在中產(chǎn)生請(qǐng)求上下文。中有和可以產(chǎn)生請(qǐng)求上下文。具體的思路還是在中重載類,通過(guò),在的上下文環(huán)境下執(zhí)行。將他們傳入,生成偽造的請(qǐng)求上下文可以覆蓋大多數(shù)的使用情況。 其實(shí)我只是想把郵件發(fā)送這個(gè)動(dòng)作移到Celery中執(zhí)行。既然用到了Celery,那么每次發(fā)郵件都單獨(dú)開(kāi)一個(gè)線程似乎有點(diǎn)多余,異步任務(wù)還是交給Celery吧...

    Sourcelink 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<