How can I detect Heroku's environment?

前端 未结 7 1635
Happy的楠姐
Happy的楠姐 2020-12-24 05:40

I have a Django webapp, and I\'d like to check if it\'s running on the Heroku stack (for conditional enabling of debugging, etc.) Is there any simple way to do this? An envi

相关标签:
7条回答
  • 2020-12-24 05:58

    Similar to what Neil suggested, I would do the following:

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

    I've seen some people use if 'PORT' in os.environ: But the unfortunate thing is that the PORT variable is present when you run foreman start locally, so there is no way to distinguish between local testing with foreman and deployment on Heroku.

    I'd also recommend using one of the env vars that:

    1. Heroku has out of the box (rather than setting and checking for your own)
    2. is unlikely to be found in your local environment

    At the date of posting, Heroku has the following environ variables:

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

    I generally go with if 'DYNO' in os.environ:, because it seems to be the most Heroku specific (who else would use the term dyno, right?).

    And I also prefer to format it like an if-else statement because it's more explicit:

    if 'DYNO' in os.environ:
        debug = False
    else:
        debug = True
    
    0 讨论(0)
  • 2020-12-24 06:05

    First set the environment variable ON_HEROKU on heroku:

    $ heroku config:set ON_HEROKU=1
    

    Then in settings.py

    import os
    
    # define if on heroku environment
    ON_HEROKU = 'ON_HEROKU' in os.environ
    
    0 讨论(0)
  • 2020-12-24 06:07

    DATABASE_URL environment variable

    in_heroku = False
    if 'DATABASE_URL' in os.environ:
        in_heroku = True
    

    I think you need to enable the database for your app with:

    heroku addons:create heroku-postgresql:hobby-dev
    

    but it is free and likely what you are going to do anyways.

    Heroku makes this environment variable available when running its apps, in particular for usage as:

    import dj_database_url
    if in_heroku:
        DATABASES = {'default': dj_database_url.config()}
    else:
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            }
        }
    

    Not foolproof as that variable might be defined locally, but convenient for simple cases.

    heroku run env
    

    might also show other possible variables like:

    • DYNO_RAM
    • WEB_CONCURRENCY

    but I'm not sure if those are documented like DATABASE_URL.

    0 讨论(0)
  • 2020-12-24 06:12

    The most reliable way would be to set an environment variable as above. If that's not possible, there are a few signs you can look for in the filesystem, but they may not be / are not foolproof

    • Heroku instances all have the path /app - the files and scripts that are running will be under this too, so you can check for the presence of the directory and/or that the scripts are being run from under it.

    • There is an empty directory /etc/heroku

    • /etc/hosts may have some heroku related domains added ~ $ cat /etc/hosts <snip>.dyno.rt.heroku.com

    Any of these can and may change at any moment.

    Your milage may vary

    0 讨论(0)
  • 2020-12-24 06:15

    An ENV var seems to the most obvious way of doing this. Either look for an ENV var that you know exists, or set your own:

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

    more at: http://devcenter.heroku.com/articles/config-vars

    0 讨论(0)
  • 2020-12-24 06:15

    Read more about it here: https://devcenter.heroku.com/articles/config-vars

    My solution:

    $ heroku config:set HEROKU=1
    

    These environment variables are persistent – they will remain in place across deploys and app restarts – so unless you need to change values, you only need to set them once.

    Then you can test its presence in your app.:

    >>> 'HEROKU' in os.environ
    True
    
    0 讨论(0)
提交回复
热议问题