• 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)
  • 相关阅读:
    写了这么久前端,你知道浏览器原理吗?
    史上最全的web前端开发程序员学习清单!
    常见前端面试题及答案
    “下辈子再也不当程序员了,我被黑够了”
    什么是web前端,全栈工程师就业前景怎么样?
    要嫁就嫁程序员,钱多话少死得早!
    想转行做web前端工程师,必学这6大技能
    测试用例设计总结
    python读取一个英文文件,并记录每个单词出现的次数,降序输出
    python读取一个文件的每一行判断是否为素数,并把结果写到另一个文件中
  • 原文地址:https://www.cnblogs.com/Erick-L/p/6978703.html
Copyright © 2020-2023  润新知