终于要git push了

Foreman

Heroku Toolbelt中还包含另一个名为Foreman的工具,它用于在本地通过Procfile运行程序以进行测试,Heroku客户端设定的像FLASK_CONFIG这样的环境变量只能在Heroku服务器上可用,因此要在本地设定,这样Foreman使用的测试环境才和生产环境类似,Foreman会在程序顶级目录中搜寻一个名为.env的文件,加载其中的环境变量,切记这个文件不能添加到Git仓库中

Foreman有多个命令,其中两个主要命令是foreman runforeman start,run命令用于在程序的环境中运行任意命令,特别适合运行创建数据库的deploy命令

(venv) $ foreman run python manage.py deploy

start命令读取Procfile的内容,执行其中的所有任务,Foreman把所有启动任务的日志输出整合在一起并转储到终端,其中每一行的前面都加入了时间戳和任务名

使用-c选项还能模拟多个Dyno,例如启动3个Web工作线程(Web worker),各职程分别监听不同端口

(venv) $ foreman start -c web=3

使用Flask-SSLify启用安全HTTP

用户登录程序时要在Web表单中提交用户名和密码,这些数据在传输过程中可被第三方截取,就像之前多次提及的,为了避免他人使用这种方式偷取用户密令,我们必须使用安全HTTP,使用公钥加密法加密法加密客户端和服务器之间传输的数据

Heroku上的程序在herokuapp.com域中可使用http://和https://访问,无需任何配置即可使用Heroku的SSL证书,唯一需要做的是让程序拦截发往Hhttp://的请求,重定向到https://,这一操作可使用Flask-SSLify扩展完成

我们要将Flask-SSLify扩展添加到requirements.txt文件中,下例为实现方法,把所有请求重定向到安全HTTP:

# app/__init__.py
def create_app(config_name):
    #...
    if not app.debug and not app.testing and not app.config['SSL_DISABLE']:
        from flask_sslify import SSLify
        sslify = SSLify(app)
    #...

对SSL的支持只需在生产模式中启用,而且所在平台必须支持,为了便于打开和关闭SSL,添加了一个名为SSL_DISABLE的新配置变量,Config基类将其设为True,即默认情况下不使用SSL,并且HerokuConfig类覆盖了这个值,这个变量的配置方式如下:

# config.py
class Config:
    #....
    SSL_DISABLE = True
class HerokuConfig(ProductionConfig):
    #...
    SSL_DISABLE = bool(os.environ.get('SSL_DISABLE'))

在Heroku类中,SSL_DISABLE的值从同名环境变量中读取,如果这个环境变量的值不是空字符串,那么将其转换成布尔值后会得到True,即禁用SSL,如果没有设定这个环境变量或者其值为空字符串,转换成布尔值后会得到False,为了避免使用Foreman时启用SSL,必须在.env文件中加入SSL_DISABLE=1

做了以上改动后用户会强制使用SSL,但还有一个细节需要处理才能完善这一功能,使用Heroku时,客户端不直接连接托管的程序,而是连接一个反向代理服务器,然后再把请求重定向到程序上,在这种连接方式中,只有代理服务器运行在SSL模式中,程序从代理服务器接收到的请求都没有使用SSL,因为在Heroku网络内部无需使用高安全性的请求,程序生成绝对URL时,要和请求使用的安全连接一致,这时就产生问题了,因为使用反向代理服务器时,request.is_secure的值一直是False

这个问题会在生成头像的URL时发生,之前User模型中的gravatar()方法在生成Gravatar URL时检查了request.is_secure,根据其值的不同分别生成安全或不安全的URL,如果通过SSL请求页面,生成的却是不安全的头像URL,某些浏览器会向用户显示安全警告,所以同一页面中的所有内容都要使用安全性相同的URL

代理服务器通过自定义的HTTP首部把客户端发起的原始请求信息传给重定向后的Web服务器,所以查看这些首部就有可能知道用户和程序通信时是否使用了SSL,Werkzeug提供了一个WSGI**中间件**,可用来检查代理服务器发出的自定义首部并对请求对象进行相应更新,例如修改后的request.is_secure表示客户端发给反向代理服务器的请求安全性,而不是代理服务器发给程序的请求安全性,下例把ProxyFix中间件添加到程序中:

class HerokuConfig(ProductionConfig):
    #...
    @classmethod
    def init_app(cls, app):
        #...
        # deal with web HEAD
        from werkzeug.contrib.fixers import ProxyFix
        app.wsgi_app = ProxyFix(app.wsgi_app)

ProxyFix中间件添加在Heroku配置的初始化方法中,添加ProxyFix等WSGI中间件的方法是包装WSGI程序,收到请求时,中间件有机会审查环境,在处理请求之前做些修改,不仅Heroku需要使用ProxyFix中间件,任何使用反向代理的部署环境都需要

执行git push

部署过程的最后一步是把程序上传到Heroku服务器,在此之前,要确保所有改动都已经提交到本地git仓库,然后执行git push heroku master把程序上传到远程仓库heroku:

(env) C:\Users\Bangys\Documents\heroku>git push heroku master
Counting objects: 4549, done.
Delta compression using up to 3 threads.
Compressing objects: 100% (4447/4447), done.
Writing objects: 100% (4549/4549), 12.81 MiB | 42.00 KiB/s, done.
Total 4549 (delta 705), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
#...后面就略了

现在程序已经部署好正在运行了,但还不能正常使用,因为还没执行deploy命令:

$ heroku run python manage.py deploy

创建并配置好数据库表之后就可以重启程序了,直接使用下述命令:

$ heroku restart

查看日志

程序生成的日志输出会被Heroku捕获,,若想查看日志内容,可使用heroku logs命令

在测试过程中,还可以使用这个命令方便的跟踪日志文件的内容:heroku logs -t

部署一次升级

升级Heroku程序时要重复上述步骤,所有改动都提交到Git仓库之后,可执行下述命令进行升级

heroku maintenance:on
git push heroku master
heroku run python manage.py deploy
heroku restart
heroku maintenance:off

Heroku客户端提供i的maintenance命令会在升级过程中下线程序,并向用户显示一个静态页面,告知网站很快就能修复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值