Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access Apache SetEnv variable from Django wsgi.py file

I'm trying to separate out Django's secret key and DB pass into environmental variables, as widely suggested, so I can use identical code bases between local/production servers.

The problem I am running into is correctly setting and then reading the environmental vars on the production server running Apache + mod_wsgi.

Vars set in my user profile aren't available because Apache isn't run as that user. Vars set in the Virtual Hosts file with SetEnv are not available because the scope is somehow different.

I've read a couple 1,2 of SO answers, which leads to this blog with a solution.

I can't figure out how to apply the solution to current versions of Django which use a wsgi.py file, which looks like:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

How can I apply that blog solution to the wsgi.py file, or is there a better place to store env-vars where Django can get at them?

like image 529
Nelluk Avatar asked Nov 03 '13 15:11

Nelluk


1 Answers

If anyone else is frustrated by Graham's answer, here is a solution that actually works for the original question. I personally find setting environmental variables from Apache to be extremely useful and practical, especially since I configure my own hosting environment and can do whatever I want.

wsgi.py (tested in Django 1.5.4)

from django.core.handlers.wsgi import WSGIHandler

class WSGIEnvironment(WSGIHandler):

    def __call__(self, environ, start_response):

        os.environ['SETTINGS_CONFIG'] = environ['SETTINGS_CONFIG']
        return super(WSGIEnvironment, self).__call__(environ, start_response)

application = WSGIEnvironment()

Of minor note, you lose the future-proof method of django.core.wsgi.get_wsgi_application, which currently only returns WSGIHandler(). If the WSGIHandler.__call__ method is ever updated and you update Django also, you may have to update the WSGIEnvironment class if the arguments change. I consider this a very small penalty to pay for the convenience.

like image 76
Abel Mohler Avatar answered Sep 19 '22 15:09

Abel Mohler