14

I'm trying to read some environment variables in Django settings, which i have defined in /home/user/.bashrc (and latter in /etc/bash.bashrc ) , but all i get is a KeyError exception. I know my environment variables are set, because i can print them in the terminal (echo $VAR_NAME). This should be trivial.

This is the code i'm using.

from django.core.exceptions import ImproperlyConfigured

msg = "Set the %s environment variable"


def get_env_variable(var_name):
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = msg % var_name
        raise ImproperlyConfigured(error_msg)

OS_DB_USER = get_env_variable('MY_USER')
OS_DB_PASS = get_env_variable('MY_PASS')
OS_DB_DB = get_env_variable('MY_DB')
OS_GAME_LOGS = get_env_variable('DIR_LOGS')

I just can't find what's missing. Any suggestions out there?

Thanks

EDIT: Running on Apache with mod_wsgi.

luistm
  • 1,027
  • 4
  • 18
  • 43

2 Answers2

11

I've manage to solve my problem by using this solution:

http://drumcoder.co.uk/blog/2010/nov/12/apache-environment-variables-and-mod_wsgi/

luistm
  • 1,027
  • 4
  • 18
  • 43
1

I've just recently found the cause of this myself.

When running under apache/mod_wsgi, your application runs under a different user, so those environment variables are not set. Your options are:

  1. Use apache SetEnv directive in your virtualhost config,
  2. Set the environment variables for the user that apache runs your code as, or
  3. Tell apache to run the wsgidaemon process as your user.
Colton W
  • 51
  • 7
  • 2
    For process environment variables, none of those will strictly work. The SetEnv directive only sets per request WSGI environ variables and not process environment variables. Setting stuff in the environment of the Apache user will not help as Apache is started as root and inherits a clean default host environment. You do not want to be adding stuff to global default host environment. And using daemon mode as a specific user will not help either, as users login scripts are never executed and so now way environment variables can be picked up in that way. – Graham Dumpleton Jul 21 '15 at 08:41
  • 1
    The easiest thing to do is to set any process environment variables as a side effect of the WSGI script file being loaded. – Graham Dumpleton Jul 21 '15 at 08:42