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)
Flask 学习 十六 部署的更多相关文章
- 强化学习(十六) 深度确定性策略梯度(DDPG)
在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...
- Flask最强攻略 - 跟DragonFire学Flask - 第十六篇 Flask-Migrate
终于到了Flask-Migrate,之前在学习Flask-SQLAlchemy的时候,有的同学就提过类似的问题,Flask支持 makemigration / migrate 吗? 答案在这里该诉你, ...
- Scala学习十六——XML处理
一.本章要点 XML字面量<like>this</like>的类型为NodeSeq 可以在XML字面量中内嵌Scala代码 Node的child属性产出后代节点 Node的at ...
- Flask 学习 十四 测试
获取代码覆盖报告 安装代码覆盖工具 pip install coverage manage.py 覆盖检测 COV = None if os.environ.get('FLASK_COVERAGE') ...
- Flask 学习 十 博客文章
提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...
- flask第二十六篇——模板【控制语句】【2】
如果你也在学flask,就请加船长的公众号:自动化测试实战 我们先补充一下for循环的知识,我们之前说过,flask是由Jinja2+sqlAlchemy+werkzeug组成的,我们现在学的控制语句 ...
- flask第十六篇——Response【2】
今天来介绍自定义返回对象: 现在我们假定有一个需求:所有的视图函数都要返回json格式的对象我们先看一下Response的源码: 发现只有一行default_mimetype='text/html', ...
- 十六.部署PXE网络装机
PXE组件及过程分析 • 需要哪些服务组件? – DHCP服务,分配IP地址.定位引导程序 – TFTP服务,提供引导程序下载 – HTTP服务,提供yum安装源 • 客户机应具备的条件 – 网卡芯片 ...
- Java学习十六
学习内容: 1.做毕设 2.Java异常类 3.Java包装类 1.System.exit(1):终止程序运行,终止final执行方法 2.throws抛出异常类型,throw抛出异常对象 用法:th ...
随机推荐
- Java百度地图经纬度纠偏
在国内使用电子地图获取到的经纬度都不是真实的经纬度,而是经过一定的算法在真实的经纬度上添加了一个偏移量,且不同的地图有不同的算法.现在告诉大家在java中怎样对百度地图进行纠偏,主要实现将真实的经纬度 ...
- [Luogu3377]【模板】左偏树(可并堆)
题面戳我 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数 ...
- [SCOI2005]王室联邦
分块基本没有限制 所以每次大于等于b就分一块 # include <bits/stdc++.h> # define RG register # define IL inline # def ...
- 使用netflix Zuul 代理你的微服务
构建 "微服务" 时的一个常见挑战是为系统的使用者提供一个统一的接口.您的服务被分割成一个个积木式的小程序,事实上这些细节本不应该对用户可见. 为了解决这个问题, Netflix ...
- Android Screen Monito
1.下载 Android Screen Monitor http://code.google.com/p/android-screen-monitor/ (1) 下載 ASM_2_40.zip 并解压 ...
- 集群session管理问题
转自:http://book.51cto.com/art/201405/439557.htm 先来看一下什么是Session. 用户使用网站的服务,基本上需要浏览器与Web 服务器的多次交互.HTTP ...
- Firefox配置文件夹详解
参考此文会帮助你更好的管理和备份Firefox配置文件,此文没有列出的文件大多是Firefox运行时生成的一些随机文件,大多无用,备份或管理配置文件时酌情删除. 在地址栏输入about:support ...
- 关于del命令
del命令用于删除具体的文件,但是删除文件的时候如果不指定文件的扩展名就会显示找不到文件 还有如果所要删除文件的文件名中含有空格的话该命令会自动识别为几个文件,就从空格处把文件 分成几份,然后就会显示 ...
- Ubuntu开启远程连接
Ubuntu开启远程连接 author:headsen chen 2017-10-13 09:47:38 个人原创,严禁转载,违者追究法律责任: apt-get update apt-get ...
- git远程提交失败
同步仓库并解决403报错 这时候对本地仓库和github进行同步 # git push -u origin master error: The requested URL returned error ...