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)