部署流程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)