部署流程

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. [BZOJ3223] [Tyvj1729] 文艺平衡树 (splay)

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  2. Vue-生命周期图示 注解

    根据腾讯课堂视频讲解,将官网生命周期图示进行注解,以加深印象和理解 贴一个源码示例: 注意位置和写法

  3. CLOB型转成字符型

    //oracle.sql.Clob类型转换成String类型 public static String ClobToString(Clob clob) { String reString = &quo ...

  4. NancyFX 第八章 内容协商

    在Web框架的范畴内,一切都是基于REST的-- 从返回包含CSS.JavaScript的网页的路由路径,到那些返回JSON数据的URL. 无论你怎么看它,两者都是必须的.我们使用一组URL来呈现UR ...

  5. Django---第三方

    第三方: 3.富文本编辑器:此处以tinymce为例 使用编辑器的显示效果为: 1.下载安装 在网站pypi网站搜索并下载"django-tinymce-2.4.0" 解压 tar ...

  6. Springboot项目如何把项目运行在服务器上

    作为一个开发者,不可避免的要把本地项目变成可以接入外网的上线项目,今天来记录下springboot框架下如果把项目打包放在服务器上运行 第一步,首先要买个服务器,这个一般甲方会提供 第二步,导入jar ...

  7. Java中常见数据结构Map之HashMap

    之前很早就在博客中写过HashMap的一些东西: 彻底搞懂HashMap,HashTableConcurrentHashMap关联: http://www.cnblogs.com/wang-meng/ ...

  8. html学习第一弹の常用标签的归类

    HTML初步学习: 行内元素:只占据他对应标签的边框所包含的空间,默认横向排布. 块级元素:块级元素占据其父元素(容器)的整个空间,因此创建了一个块,通常浏览器会在块级元素前后另起一行,默认竖向排布. ...

  9. signalR的集群与负载均衡

    signalR是相当不错的websocket应用,最近要做集群和负载均衡 主要用到了redis进行集群,signalR的backplane集成redis. 细节,订阅redis之后注意database ...

  10. this->的作用

    参考:https://www.zhihu.com/question/23324143 1.来源: 当年没有C++编译器,只能通过C++转成C语言才编译.而C++中的class就被翻译C语言的struc ...