zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/Erick-L/p/6978703.html
Copyright © 2011-2022 走看看