部署方式

部署流程

不管使用哪種託管方案,程序安裝到生產服務器上之後,都要執行一系列的任務,最好的例子就是創建或更新數據庫表

如果每次安裝或升級程序都手動執行任務,那麼容易出錯也浪費時間,所以我們可以在manage.py中添加一個命令,自動執行所需操作

下例實現了一個適用於Flasky的deploy命令

# manage.py
@manager.command
def deploy():
    """Run deployment tasks"""
    from flask_migrate import upgrade
    from app.models import Role, User
    # updata
    upgrade()
    # create user_role
    Role.insert_roles()
    # all user follow that
    User.add_self_follows()

定義這些函數時考慮到了多次執行的情況,所以即使多次執行也不會產生問題,因此每次安裝或省級程序時只需運行deploy命令就能完成所有操作

把生產環境中的錯誤寫入日誌

如果調試模式中運行的程序發生錯誤,那麼會出現Werkzeug中的交互式調試器,網頁中顯示錯誤的棧跟蹤,而且可以查看源碼,甚至還能使用Flask的網頁版交互調試器在每個棧幀的上下文中執行表達式

調試器是開發過程中進行問題調試的優秀工具,但其顯然不能在生產環境中使用,生產環境中發生的錯誤會被靜默掉,取而代之的是向用戶顯示一個500錯誤頁面,不過幸好錯誤的棧跟蹤不會完全丟失,因爲Flask會將其寫入日誌文件

在程序啓動過程中,Flask會創建一個Python提供的logging.Logger類實例,並將其附屬到程序實例上,得到app.logger,在調試模式中,日誌記錄器會把記錄寫入終端,但在生產模式中,默認情況下沒有配置日誌的處理程序,所以如果不添加處理程序,就不會保存日誌,下例的改動配置了一個日誌處理程序,把生產模式中出現的錯誤通過電子郵件發送給FLASKY_ADMIN中設置的管理員

# config.py
class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data.sqlite')     
    @classmethod
    def init_app(cls, app):
        Config.init_app(app)

        # send errorinformation to administrator
        import logging
        from logging_handlers import SMTPHandler
        credentials = None
        secure = None
        if gerattr(cls, 'MAIL_USERNAME', None) is not None:
            credentials = (cls.MAIL_USERNAME, cls.MAIL_PASSWORD)
            if getattr(cls, 'MAIL_USE_TLS', None):
                secure = ()
            mail_handler = SMTPHandler(
                mailhost = (cls.MAIL_SERVER, cls.MAIL_PORT),
                fromaddr = cls.FLASKY_MAIL_SENDER,
                toaddrs = [cls.FLASKY_ADMIN],
                subject = cls.FLASKY_MAIL_SUBJECT_PREFIX + 'Application Error',
                credentials = credentials,
                secure = secure)
            mail_handler.setLevel(logging.ERROR)
            app.logger.addHandler(mail_handler)

所有配置實例都有一個init_app()靜態方法,在create_app()方法中調用,在ProductionConfig類和init_app()方法的實現中,配置程序的日誌記錄器把錯誤寫入電子郵件日誌記錄器

電子郵件日誌記錄器的日誌等級被設爲logging.ERROR, 所以只有發生嚴重錯誤時纔會發送電子郵件,通過添加適當的日誌處理程序,可以把較輕緩等級的日誌消息寫入文件、系統日誌或其他的支持方式,這些日誌消息的處理方法很大程度上依賴於程序使用的託管平臺

雲部署

程序託管的最新潮流是託管到雲端,雲技術以前稱爲平臺即服務(Platform as a Server, PaaS),它讓程序開發者從安裝和維護運行程序的軟硬件平臺的日常工作中解放出來,在PaaS模型中,服務提供商完全接管了運行程序的平臺,程序開發者使用服務商提供的工具和庫把程序集成到平臺上,然後將其上傳到提供商維護的服務器中,部署的過程往往只需幾秒鐘,大多數PaaS提供商都可以通過按需添加或刪除服務器以實現程序的動態拓展,從而滿足不同請求量的需求

雲部署有較高的靈活性,而且使用起來相對容易,這些優勢都是花錢買來的,Heroku是最流行的PaaS提供商之一,對Python支持良好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章