2009/11/27 Aljosa Mohorovic <[email protected]>:
> short intro:
> - i'm talking about django project but use case should be relevant for
> any wsgi app
> - i'm using virtualenv/pip to install packages from private pypi
> (python libraries, django apps, ...) for this project
> - the only thing that isn't installed via virtualenv/pip is django
> project (settings.py, urls.py and similar), it's updated from source
> repository (using git)
>
> my goal:
> 1) create python package for django project and install it via pip
> (this also removes any git usage in project deployment)
> 2) configure django project/wsgi app via apache wsgi script
>
> #1 is pretty simple so no questions about that.
>
> my solution for #2 is to define in <PROJECT NAME>.wsgi:
> ----------------------------------------
> PROJECT_SETTINGS = {
>    'PROJECT_ROOT': PROJECT_ROOT,
>    'DATABASE_ENGINE': 'sqlite3',
>    'DATABASE_NAME': os.path.join(PROJECT_ROOT, 'dev.db'),
> }
>
> for k,v in PROJECT_SETTINGS.iteritems():
>    os.environ["DJANGO_%s" % k] = v
> os.environ['DJANGO_SETTINGS_MODULE'] = 'wsgi_app.settings'
> ----------------------------------------
>
> and then handle this in wsgi app (in my case django project
> settings.py) using something like:
> ----------------------------------------
> for k,v in os.environ.iteritems():
>    if k != "DJANGO_SETTINGS_MODULE" and k.startswith("DJANGO_"):
>        key = k[7:]
>        locals()[k] = v
> ----------------------------------------
>
> can you recommend a better way? any ideas/tips are appreciated.
>
> Aljosa Mohorovic
>
> p.s.
> feel free to tell me i'm an idiot, i can handle it. just recommend a
> better way to do this...

Using environment variables for arbitrary configuration is a bad idea.
To understand some of the problems with doing that in Python in multi
interpreter process environment read:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Application_Environment_Variables

What you could instead do is:

  import os

  import wsgi_app.settings as settings

  settings.PROJECT_ROOT = PROJECT_ROOT
  settings.DATABASE_ENGINE = 'sqlite3',
  settings.DATABASE_NAME = os.path.join(PROJECT_ROOT, 'dev.db')

  os.environ['DJANGO_SETTINGS_MODULE'] = 'wsgi_app.settings'

In other words, have WSGI script file import your baseline settings
file and then override the values in it from WSGI script file by way
of assignment. Then set DJANGO_SETTINGS_MODULE as per normal etc.

Dangers of this are that you might have password database information
in WSGI script file. Technically WSGI script file is going to be
marked as a file that Apache can serve up to clients. Normally it
doesn't serve the content and instead the content is interpreted by
mod_wsgi, but stuff up your Apache configuration bad and you
inadvertently provide a way of it being able to be requested by a
client as a static file.

As such, always better to keep sensitive configuration information out
of the WSGI script file. If you are confident in your ability to
configure Apache, then no problems.

BTW, what most would do is have multiple settings files in project,
ie., development_settings.py, production_settings.py, etc. These would
do 'from settings import *' then they would override values. The
DJANGO_SETTINGS_MODULE for production would then specify
'wsgi_app.production_settings'.

Graham

--

You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/modwsgi?hl=en.


Reply via email to