Flask 学习 十六 部署

部署流程

manage.py 部署命令 每次安装升级只需运行deploy命令即可完成操作

@manager.command
def deploy():
    """执行部署任务"""
    from flask_migrate import upgrade
    from app.models import Role, User
    # 把数据库迁移到最新修订版本
    upgrade()
    # 创建用户角色
    Role.insert_roles()
    # 让所有用户都关注此用户
    User.add_self_follows()

 把生产环境中的错误写入日志

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)

        # 把错误通过电子邮件发送给管理员
        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 gunicorn

gunicorn manage:app  使用gunicorn运行程序

添加依赖需求文件

requirements.txt HEROku需求文件

-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

传统的托管

1、架设服务器

2、导入环境变量

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)

 

posted @ 2017-06-10 14:38  Erick-LONG  阅读(543)  评论(0编辑  收藏  举报