Thanks for the replies. I like the middleware solution, if you can modify settings variables during middleware processing. The documentation warns against altering settings at runtime.
What are the consequences of ignoring the warning? Eric, I don't think setting up multiple projects would work well in this case. I didn't make it clear in my original post, but there would be more than two sites, more than 2 template directories, and possibly other settings based on http header information. The variety of possible combinations might get a little unweildy and require too many instances of django. Graham: Wow, that is a lot :). In addition to what I mentioned above, I would like all this to be as easy as possible to configure (the software will be distributed). --Greg On Aug 29, 8:00 am, Graham Dumpleton <[EMAIL PROTECTED]> wrote: > On Aug 29, 8:50 pm, Erik Allik <[EMAIL PROTECTED]> wrote: > > > > > For the iPhone templates issue, I'd set up two projects instead of one > > -- one for regular browsers, one for the iPhone. Then I'd simply > > redirect from the regular one to the iPhone one as needed. Although > > this has the negative side effect of having more than one URL per > > resource, but you could also customize content visibility. > > > Same for the second example -- normally one project is set up per > > domain. > > > Erik > > > On 29.08.2008, at 1:24, Greg Fuller wrote: > > > > I would like a way to to adjust settings based on information in the > > > http header. I've seen a similar question asked before, but I don't > > > need all the django request object, just the http header information. > > > More specifically, user_agent, http_host, and path_info. > > > > Here are two examples of the sort of things I would like to do: > > > > # use iphone template if appropriate > > > if http_header['USER_AGENT'].find('iphone'): > > > TEMPLATE_DIRS = ( > > > os.path.join(cur_dir_path, 'template_sets/' + 'iphone'), > > > > # set SITE_ID for MyOtherDomain.com > > > if http_header["HTTP_HOST"].find('myotherdomain.com'): > > > SITE_ID = 2 > > > > Does anyone know if this can be done? > > I am reasonably sure both of you could do what you want using > mod_wsgi. That is based on user agent map to different instances of > Django where only difference is the settings file that was used. > Importantly, in the process using the same host name and URLs. > > I'll explain how to setup Apache configuration etc, but will not be > surprised if I loose you along the way. :-) > > First off, for this example I'll use daemon mode of mod_wsgi. What we > will do here is create two distinct mod_wsgi daemon process groups to > hold the two Django instances. I'll show it as two single but > multithreaded processes (ie., the default), but you can change that. > > WSGIDaemonProcess config-1 display-name=%{GROUP} > WSGIDaemonProcess config-2 display-name=%{GROUP} > > With display-name option, these show separately in 'ps' output as: > > 70 2802 2800 0 0:00.01 ?? 0:00.01 (wsgi:config-1) -D > FOREGROUND > 70 2803 2800 0 0:00.01 ?? 0:00.01 (wsgi:config-2) -D > FOREGROUND > > Am then going to force the main interpreter in each process to be used > for handling any requests. This is actually to make it easier as need > to name the interpreter within the processes for next step. > > WSGIApplicationGroup %{GLOBAL} > > What we want to do now is setup each of those two process with > different environment. Specifically, we want to set > DJANGO_SETTINGS_MODULE environment variable to be different for each. > Normally we do this in the WSGI script file, but we will only have one > WSGI script file and no way to determine what to make the setting when > WSGI script file is first loaded. What we instead do is use ability to > preload a script file when processes are started. > > WSGIImportScript /Users/grahamd/Sites/config-1.wsgi \ > process-group=config-1 application-group=%{GLOBAL} > > WSGIImportScript /Users/grahamd/Sites/config-2.wsgi \ > process-group=config-2 application-group=%{GLOBAL} > > The options to the directive allow us to indicate a different file to > preload for each process. > > For the contents of 'config-1.wsgi' have: > > import os > os.environ["DJANGO_SETTINGS_MODULE"] = "site.settings1" > > For the contents of 'config-2.wsgi' have: > > import os > os.environ["DJANGO_SETTINGS_MODULE"] = "site.settings2" > > To configure mod_wsgi to host Django application itself, would > normally have: > > Alias /media/ /usr/local/django/mysite/media/ > > <Directory /usr/local/django/mysite/media> > Order deny,allow > Allow from all > </Directory> > > WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi > > <Directory /usr/local/django/mysite/apache> > Order deny,allow > Allow from all > </Directory> > > The WSGI script file would normally be: > > import os, sys > sys.path.append('/usr/local/django') > os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' > > import django.core.handlers.wsgi > > application = django.core.handlers.wsgi.WSGIHandler() > > but we don't want that, and instead we want: > > import sys > sys.path.append('/usr/local/django') > > import django.core.handlers.wsgi > > application = django.core.handlers.wsgi.WSGIHandler() > > The difference here being that we have dropped setting of > DJANGO_SETTINGS_MODULE as this was done from preloaded scripts. > > As to settings1 and settings2, these would be in same directory as > where settings file would normally be. They could be a complete copy > of original settings files with each modified as per requirement, ie. > setting TEMPLATE_DIRS differently. Or you could do: > > from settings import * > > TEMPLATE_DIRS = "......." > > That is import everything out of main settings file and just override > what you want. > > Now, there is one final bit missing from all of this because if we use > that as is, the requests will actually be handled in embedded mode as > haven't delegated that requests actually be run in the daemon > processes. What we will now do is provide a dispatch routine so can > automatically select which daemon process is used for requests. > Configuration for that is: > > WSGIDispatchScript /Users/grahamd/Sites/dispatch.wsgi > > The content of the dispatch script would then contain: > > def process_group(environ): > agent = environ.get("HTTP_USER_AGENT", "") > > if agent.find("Safari") != -1: > return "config-1" > > return "config-2" > > In this example what it is going to do is return that 'config-1' > process group should be used if Safari web browser is used, otherwise > use 'config-2' process group. Obviously you do proper matching of user > agent string as appropriate. > > Now, I used daemon processes and the dispatch script to make it more > obvious but in case you needed to complicated things based on headers, > but other things could be done instead which may be a bit simpler. > > First off you could do away with the dispatch script. That is, don't > use WSGIDispatchScript. Instead should be able to use something like: > > BrowserMatch .* PROCESS_GROUP=config-2 > BrowserMatch Safari PROCESS_GROUP=config-1 > > WSGIProcessGroup %{ENV:PROCESS_GROUP} > > That is, use mod_setenvif to match browser instead of dispatch being > handled in code. Using mod_setenvif has less overhead. > > Next thing that can be done is not to use daemon mode of mod_wsgi but > run both instances in embedded mode instead, in separate interpreters. > For this we drop the WSGIDaemonProcess directives. When selecting > based off browser, select application group in embedded mode instead. > Thus: > > WSGIImportScript /Users/grahamd/Sites/config-1.wsgi \ > process-group=%{GLOBAL} application-group=config-1 > > WSGIImportScript /Users/grahamd/Sites/config-2.wsgi \ > process-group=%{GLOBAL} application-group=config-2 > > BrowserMatch .* APPLICATION_GROUP=config-2 > BrowserMatch Safari APPLICATION_GROUP=config-1 > > WSGIProcessGroup %{GLOBAL} > WSGIApplicationGroup %{ENV:APPLICATION_GROUP} > > Obviously all the Apache child processes would twice as fat, where as > with daemon mode just one process for each instance. > > Thus, various ways to handle the dispatch, and also can choose to host > as different interpreters with embedded mode processes or direct to > different daemon mode processes depending on what you need. You could > even get more tricky by running primary instance in embedded mode and > delegating just the one for the special browser to daemon mode, > especially if not frequently used. > > Anyway, that should give you a lot to chew over. :-) > > Graham --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---