Flask 學習 十六 部署

部署流程python

manage.py 部署命令 每次安裝升級只需運行deploy命令便可完成操做git

@manager.command
def deploy():
    """執行部署任務"""
    from flask_migrate import upgrade
    from app.models import Role, User
    # 把數據庫遷移到最新修訂版本
    upgrade()
    # 建立用戶角色
    Role.insert_roles()
    # 讓全部用戶都關注此用戶
    User.add_self_follows()

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

config.py 程序出錯時發送電子郵件sql

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)

        # 把錯誤經過電子郵件發送給管理員
        import logging
        from logging.handlers import SMTPHandler
        credentials = None
        secure = None
        if getattr(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)

運行生產服務器數據庫

pip install gunicornflask

gunicorn manage:app  使用gunicorn運行程序安全

添加依賴需求文件服務器

requirements.txt HEROku需求文件app

-r requirements/prod.txt
gunicorn==18.0
psycopg2=2.5.1

添加procfile文件測試

web: gunicorn manage:app 

使用Foreman進行測試

.env文件

FLASK_CONFIG=heroku
MAIL_USERNAME = XXX
MAIL_PASSWORD=XXX

foreman run python manage.py deploy 運行程序中的任意命令(run)

star命令讀取procfile的內容,執行其中全部任務

foreman start

使用-c命令能夠模擬多個工做線程

foreman start -c web=3

使用Flask-SSLify啓用安全HTTP

pip install flask-sslify

app/__init__.py

  # 把請求重定向到安全的HTTP
    if not app.debug and not app.testing and not app.config['SSL_DISABLE']:
        from flask_sslify import SSLify
        sslify = SSLify(app)

config.py  配置是否使用SSL

SSL_DISABLE=True # 配置是否使用SSL
class HerokuConfig(ProductionConfig):
    SSL_DISABLE=bool(os.environ.get('SSL_DISABLE'))
    @classmethod
    def init_app(cls,app):
        ProductionConfig.init_app(app)
        # 輸出到stderr
        import logging
        from logging import StreamHandler
        file_handler = StreamHandler()
        file_handler.setLevel(logging.WARNING)
        app.logger.addHandler(file_handler)

        # 處理代理服務器的首部
        from werkzeug.contrib.fixers import ProxyFix
        app.wsgi_app=ProxyFix(app.wsgi_app)
config={
    'development':DevelopmentConfig,
    'testing':TestingConfig,
    'production':ProductionConfig,
    'default':DevelopmentConfig,
    'heroku': HerokuConfig,
}

爲了不使用Foreman時啓用SSL,必須在.env文件中加入SSL_DISABLE=1

config.py 支持代理服務器

class HerokuConfig(ProductionConfig):
      # 處理代理服務器的首部
        from werkzeug.contrib.fixers import ProxyFix
        app.wsgi_app=ProxyFix(app.wsgi_app)

執行git push命令部署

提交到本地git倉庫。執行git push heroku master 把程序上傳到遠程倉庫

運行須要執行

heroku run python manage.py deploy

建立並配置數據庫表重啓

heroku restart

查看日誌

heroku logs

測試過程跟蹤股文件日誌內容

heroku logs -t

部署一次升級

heroku maintenance:on   在升級過程當中下線程序,並顯示一個靜態頁面

git push heroku master

hero run python manage.py deploy

heroku restart

heroku maintenance:off

傳統的託管

一、架設服務器

二、導入環境變量

manage.py 從.env文件中導入環境變量,其中至少要包含FLASK_CONFIG變量,用以選擇要使用的配置

@manager.command
def test(coverage=False):
    if os.path.exists('.env'):
        print('Importing environment from .env...')
        for line in open('.env'):
            var = line.strip().split('=')
            if len(var) == 2:
                os.environ[var[0]] = var[1]

配置日誌

config.py Unix配置 程序日誌會寫入/var/log/messages

class UnixConfig(ProductionConfig):
    @classmethod
    def init_app(cls, app):
        ProductionConfig.init_app(app)
        # 寫入系統日誌
        import logging
        from logging.handlers import SysLogHandler
        syslog_handler = SysLogHandler()
        syslog_handler.setLevel(logging.WARNING)
        app.logger.addHandler(syslog_handler)
相關文章
相關標籤/搜索