Cannot get environment variables in Django settings file

16,066

Solution 1

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/

Solution 2

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.
Share:
16,066

Related videos on Youtube

luistm
Author by

luistm

Updated on June 04, 2022

Comments

  • luistm
    luistm almost 2 years

    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.

  • Graham Dumpleton
    Graham Dumpleton almost 9 years
    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
    Graham Dumpleton almost 9 years
    The easiest thing to do is to set any process environment variables as a side effect of the WSGI script file being loaded.