web-dev-qa-db-ja.com

Herokuの環境を検出するにはどうすればよいですか?

Django webappがあり、Herokuスタックで実行されているかどうかを確認したい(デバッグを条件付きで有効にするなど)これを行う簡単な方法はありますか?環境変数、おそらく?

おそらく逆の方法でも実行できることはわかっています。つまり、開発者のマシンで実行されているかどうかを検出しますが、それは「正しく聞こえない」だけです。

38
aviraldg

ENV varは、これを行う最も明白な方法のようです。存在することがわかっているENV変数を探すか、独自に設定します。

on_heroku = False
if 'YOUR_ENV_VAR' in os.environ:
  on_heroku = True

詳細: http://devcenter.heroku.com/articles/config-vars

21
Neil Middleton

ニールが提案したのと同様に、私は次のことを行います。

debug = True
if 'SOME_ENV_VAR' in os.environ:
    debug = False

if 'PORT' in os.environ:を使用する人もいますが、残念ながら、foreman startをローカルで実行するとPORT変数が存在するため、フォアマンによるローカルテストとHerokuでのデプロイを区別する方法がありません。

また、次のいずれかのenv変数を使用することをお勧めします。

  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
18
Ryan

まず、herokuに環境変数ON_HEROKUを設定します。

$ heroku config:set ON_HEROKU=1

次に、settings.py

import os

# define if on heroku environment
ON_HEROKU = 'ON_HEROKU' in os.environ
12
ilovett

詳細については、こちらをご覧ください: https://devcenter.heroku.com/articles/config-vars

私の解決策:

$ heroku config:set HEROKU=1

これらの環境変数は永続的であり、デプロイとアプリの再起動の間もそのまま残ります。したがって、値を変更する必要がない限り、設定する必要があるのは1回だけです。

次に、アプリでその存在をテストできます。

>>> 'HEROKU' in os.environ
True
1
Jabba

最も信頼できる方法は、上記のように環境変数を設定することです。それが不可能な場合は、ファイルシステムで探すことができる兆候がいくつかありますが、それらは絶対確実ではない/絶対確実ではない可能性があります

  • Herokuインスタンスにはすべてパス/appがあります。実行中のファイルとスクリプトもこの下にあるため、ディレクトリの存在や、その下からスクリプトが実行されているかどうかを確認できます。

  • 空のディレクトリがあります/etc/heroku

  • /etc/hostsにはいくつかのheroku関連ドメインが追加されている可能性があります~ $ cat /etc/hosts <snip>.dyno.rt.heroku.com

これらはいつでも変更される可能性があります

あなたのマイレージは変わるかもしれません

1
Rebs