成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

wmui / 3448人閱讀

摘要:中的配置,都是通過來控制那么究竟是什么再來看函數(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就是一個特殊的字典,用于保存配置項。

extension

flask是一個微框架,需要使用插件來擴展功能,那么擴展的原理是什么呢?
擴展程序需要與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

相關文章

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

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

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

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

    Taste 評論0 收藏0
  • 在Celery中使用Flask的上下文

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

    Sourcelink 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<