如何检测Heroku的环境?

avi*_*ldg 38 python deployment django environment heroku

我有一个Django webapp,我想检查它是否在Heroku堆栈上运行(有条件启用调试等)有没有简单的方法来做到这一点?也许是一个环境变量?

我知道我也可以反过来做 - 也就是说,让它检测它是否在开发者机器上运行,但这听起来并不"正确".

Nei*_*ton 21

ENV var似乎是最明显的做法.要么找到你知道存在的ENV var,要么设置你自己的:

on_heroku = False
if 'YOUR_ENV_VAR' in os.environ:
  on_heroku = True
Run Code Online (Sandbox Code Playgroud)

更多内容:http://devcenter.heroku.com/articles/config-vars

  • 快捷方式:os.environ中的on_heroku ='DYNO' (2认同)
  • 不要按照tinchou的建议在os.environ中使用on_heroku ='DYNO'.在某些buildpack操作期间未设置该环境变量,例如当collectstatic自动运行django构建时.这几乎是不可能调试的 - 你使用上述解决方案要好得多. (2认同)

Rya*_*yan 18

与Neil建议的类似,我会做以下事情:

debug = True
if 'SOME_ENV_VAR' in os.environ:
    debug = False
Run Code Online (Sandbox Code Playgroud)

我见过一些人使用if 'PORT' in os.environ:但不幸的是,当你在foreman start本地运行时,PORT变量存在,所以没有办法区分本地测试与工头和Heroku上的部署.

我还建议使用其中一个环境变量:

  1. Heroku开箱即用(而不是设置和检查你自己的)
  2. 不太可能在您的本地环境中找到

在发布之日,Heroku具有以下环境变量:

['PATH', 'PS1', 'COLUMNS', 'TERM', 'PORT', 'LINES', 'LANG', 'SHLVL', 'LIBRARY_PATH', 'PWD', 'LD_LIBRARY_PATH', 'PYTHONPATH', 'DYNO', 'PYTHONHASHSEED', 'PYTHONUNBUFFERED', 'PYTHONHOME', 'HOME', '_']

我一般都去if 'DYNO' in os.environ:,因为它似乎是最具特异性的Heroku(还有谁会使用dyno一词,对吧?).

而且我也喜欢将其格式化为if-else语句,因为它更明确:

if 'DYNO' in os.environ:
    debug = False
else:
    debug = True
Run Code Online (Sandbox Code Playgroud)

  • 为了安全起见,如果你确实这样做的话,默认情况下你应该是“DEBUG=False”。像`DEBUG=False;这样的东西 如果 os.environ 中不是“DYNO”:debug=True` 或许? (2认同)

ilo*_*ett 11

首先ON_HEROKU在heroku上设置环境变量:

$ heroku config:set ON_HEROKU=1
Run Code Online (Sandbox Code Playgroud)

然后进去 settings.py

import os

# define if on heroku environment
ON_HEROKU = 'ON_HEROKU' in os.environ
Run Code Online (Sandbox Code Playgroud)