I have one question about changing the site ID per request.
I assume that settings is imported from conf, and so in the end it is simply
changing the same SITE_ID to fit the current request Django is handling.

Does this ever become a problem? I am setting up around 250 sites for
example. If the site_id had a conflict because it is trying to be changed in
two places at the same time.

It is probably a dumb question, but I was wondering.

Cheers,
James Hancock

On Fri, Jan 28, 2011 at 2:54 PM, Jjdelc <jjd...@gmail.com> wrote:

> If all you need to change is the SITE_ID on the settings file, using
> different files for each is not only a mess to handle, but also means
> that you'll spend extra RAM for each instance running.
>
> I solve this by using a middleware that changes the SITE_ID based on
> the request's hostname:
>
> SITES_DICT = 'cached-sites-dict'
>
> class MultiHostMiddleware(object):
>    def process_request(self, request):
>        if cache.has_key(SITES_DICT):
>            sites = cache.get(SITES_DICT)
>        else:
>            sites = {}
>            for site in Site.objects.all():
>                sites[site.domain.lower()] = {
>                    'id': site.id,
>                }
>            cache.set(SITES_DICT, sites)
>
>        try:
>            host = request.META["HTTP_HOST"].lower().replace('www.',
> '')
>            domain = urlparse(host).path
>            settings.SITE_ID = sites[domain]['id']
>        except KeyError:
>            raise Http404()
>
> This way I only have one instance running 'hundreds' of websites.
> With this approach you can create a OneToOne model SiteOptions to
> store extra settings, like TEMPLATE_DIRS, STATIC_ROOT, or other site's
> options like API keys and such. I have an app that has the fields for
> the site I'm doing but it works fine.
>
> If you need different urlconfs, you could also do it in the middleware
> (since urls are resolved against request.urlconf which you can set
> there), but I think that at that point you're talking about another
> website so I'd use a different settings file for it.
>
>
> On Jan 27, 3:16 pm, Graham Dumpleton <graham.dumple...@gmail.com>
> wrote:
> > On Friday, January 28, 2011 2:09:06 AM UTC+11, Tom Evans wrote:
> >
> > > On Wed, Jan 26, 2011 at 6:18 PM, Jari Pennanen <jari.p...@gmail.com>
> > > wrote:
> > > > On Jan 26, 6:56 pm, FeatherDark <msens...@gmail.com> wrote:
> > > >> Greetings huge django developer list,
> > > >> I just wanted to mention, this method totally works for me, I call
> it
> > > >> "Skinning"
> >
> > > >> In the templates folder I have a file called "base.html'
> > > >> Inside that file is only 1 line:
> > > >> {% extends request.META.HTTP_HOST|cut:':'|add:'.html'%}
> >
> > > > request.META.HTTP_HOST is coming from Client. "Trust but verify", you
> > > > are not verifying this. It could pose a security risk. One could send
> > > > a request with malicious Host header and make the site retrieve
> > > > different template. This is not a serious issue, since you probably
> > > > don't have templates that would wreak havoc.
> >
> > > > Why don't you create own template context processor that would add
> the
> > > > verified HTTP_HOST to template context? Then you could do just
> >
> > > > {% extend MY_VERIFIED_HTTP_HOST %}
> >
> > > > See:
> >
> > >http://docs.djangoproject.com/en/dev/ref/request-response/#django.htt.
> ..
> >
> > >http://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-.
> ..
> >
> > > request.META['HTTP_HOST'] is also the primary mechanism for
> > > determining which website to serve when doing virtual hosting, IE if
> > > you use apache and your site is hosted in a structure like:
> >
> > > NameVirtualHost *:80
> > > <VirtualHost *:80>
> > >   ServerNamewww.foo.com
> > >   ServerAlias *.foo.com *.bar.com *.quuz.com
> > >   ....
> > > </VirtualHost>
> >
> > > Then that variable already is being verified.
> >
> > Yes and no.
> >
> > Apache uses it to resolve name based virtual hosts, but if it cant match
> it
> > against a specific virtual host from memory it routes the request to the
> > first VirtualHost which was found in the Apache configuration for that
> port.
> >
> > Have many times seen broken VirtualHost configurations which shouldn't
> work,
> > but seem to, because the user only had one VirtualHost definition and so
> > Apache was routing the request to it anyway.
> >
> > If you were going to be rigorous you would add a dummy VirtualHost as
> first
> > in Apache configuration and have 'Deny from all' in it so that any
> attempts
> > to access unknown host would fallback to this and get forbidden.
> >
> > Graham
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django developers" group.
> To post to this group, send email to django-developers@googlegroups.com.
> To unsubscribe from this group, send email to
> django-developers+unsubscr...@googlegroups.com<django-developers%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/django-developers?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to