部署流程

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)

Flask 学习 十六 部署的更多相关文章

  1. 强化学习(十六) 深度确定性策略梯度(DDPG)

    在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...

  2. Flask最强攻略 - 跟DragonFire学Flask - 第十六篇 Flask-Migrate

    终于到了Flask-Migrate,之前在学习Flask-SQLAlchemy的时候,有的同学就提过类似的问题,Flask支持 makemigration / migrate 吗? 答案在这里该诉你, ...

  3. Scala学习十六——XML处理

    一.本章要点 XML字面量<like>this</like>的类型为NodeSeq 可以在XML字面量中内嵌Scala代码 Node的child属性产出后代节点 Node的at ...

  4. Flask 学习 十四 测试

    获取代码覆盖报告 安装代码覆盖工具 pip install coverage manage.py 覆盖检测 COV = None if os.environ.get('FLASK_COVERAGE') ...

  5. Flask 学习 十 博客文章

    提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...

  6. flask第二十六篇——模板【控制语句】【2】

    如果你也在学flask,就请加船长的公众号:自动化测试实战 我们先补充一下for循环的知识,我们之前说过,flask是由Jinja2+sqlAlchemy+werkzeug组成的,我们现在学的控制语句 ...

  7. flask第十六篇——Response【2】

    今天来介绍自定义返回对象: 现在我们假定有一个需求:所有的视图函数都要返回json格式的对象我们先看一下Response的源码: 发现只有一行default_mimetype='text/html', ...

  8. 十六.部署PXE网络装机

    PXE组件及过程分析 • 需要哪些服务组件? – DHCP服务,分配IP地址.定位引导程序 – TFTP服务,提供引导程序下载 – HTTP服务,提供yum安装源 • 客户机应具备的条件 – 网卡芯片 ...

  9. Java学习十六

    学习内容: 1.做毕设 2.Java异常类 3.Java包装类 1.System.exit(1):终止程序运行,终止final执行方法 2.throws抛出异常类型,throw抛出异常对象 用法:th ...

随机推荐

  1. 没什么技术含量的Remove Before Flight

    航空业有很多值得我们借鉴和学习的工作方式,将来有时间我会给大家引荐更多实例. 仔细观察每架停泊着的飞机,会发现机身很多地方都挂着细长的红布条,上面写着"REMOVE BEFORE FLIGH ...

  2. datatable 参数详细说明

    页面参数说明 var docrTable = $('#docrevisontable').dataTable({ language:lang, //提示信息 autoWidth: false, //禁 ...

  3. sqoop2报错

    sqoop:000> create link --cid 4 Creating link for connector with id 4Exception has occurred during ...

  4. Linux内核调优参数说明

    该脚本是我常用的系统安装后执行脚本,包括开机启动服务.内核.SSH优化. !/bin/sh 服务优化,(sshd.network.crond.syslog.rsyslog)服务保持默认开机启动 Ser ...

  5. node nvm npm nrm 安装

    http://cnodejs.org/topic/57f628098489e7ca69f4e839 //1.vim ~./bashrc 文件 把那两行配置代码加进入,然后按步骤执行 //console ...

  6. 使用netflix Zuul 代理你的微服务

    构建 "微服务" 时的一个常见挑战是为系统的使用者提供一个统一的接口.您的服务被分割成一个个积木式的小程序,事实上这些细节本不应该对用户可见. 为了解决这个问题, Netflix ...

  7. C#多线程编程序--聊聊线程

    这篇文章主要给您讲解几个基本问题,什么是线程?为什么要用线程?线程万能?这几个问题.我这篇博客是在该系列另外几篇博客之后写的,之所以不往下继续写,而是回到最初的问题,是因为我感觉到我没有很好的讲解开头 ...

  8. 九大排序算法的Java实现

    1.冒泡排序 package Sort; import java.util.Arrays; public class BubbleSort { public static void main(Stri ...

  9. angularjs 缓存详解

    一.什么是缓存 一个缓存就是一个组件,它可以透明地存储数据,以便未来可以更快地服务于请求. 缓存能够服务的请求越多,整体系统性能就提升得越多. 二.Angular 中的缓存 2.1 $cacheFac ...

  10. Linux远程连接工具

    Linux远程连接可以使用SecureCRT工具完成 SecureCRT下载地址 修改虚拟机中的网络适配器---改为桥接模式 一,配置:在Linux终端上获取IP地址----ifconfig 二,同时 ...