This post is getting pretty long. But I had a simple Django fix that would
make it work a lot easier for me, and might help others. (I say this because
of how I implemented it, I am working with about 60 different sites and it
is a pretty simple arrangement)

Imagine you were able to set a site_id per request rather than relying on
the settings SITE_ID. Django would then checked for a request's site_id *first
*and then *second *check the settings one.

It is really simple, but it would fix a lot of my problems and avoid having
to switch around the settings SITE_ID per request. Setting the requests
site_id with middleware is straightforward enough and further customizations
to the request. Changing the urls for example.

This approach would avoid:

   - Threading issus, and global variables
   - Adding new functions to work with (Saves time and pain, documentation,
   testing, releases so forth)
   - Doesn't break things that are tied into the Sites Framework(site-maps,
   comments, etc...)

It also feels a little more DRY to me.

Let me know if I have assumed something I shouldn't have. I don't know much
about how the current implementation and use of SITE_ID in the backend.

Cheers,
James Hancock


On Mon, Jan 31, 2011 at 6:09 AM, lwcy...@gmail.com <lwcy...@gmail.com>wrote:

> I believe this ticket: http://code.djangoproject.com/ticket/14628
>
> which was created during this chat session
>
> http://www.revsys.com/officehours/2010/nov/05/#question5
>
> is also relevant to the issue at hand.
>
> An interesting bit of that chat is:
> jacobkmnicoechaniz: one hint is that although the documentation says that
> you shouldn't modify settings at runtime, in fact many of them *can* be
> changed at runtime without problems. Unfortunately there's a bit of a
> trial-and-error in figuring out which.Ticket #14628 describes the
> situation.
>
>
> The proposals in Ticket #15089 (and the related thread) approach the
> multi-tenancy problem by providing the means to determine the current site
> dynamically, but this, IMHO, does not fully solve the issue.
>
> In our case (it's described in the chat-log) we have 1500 sites which would
> benefit from having separate settings files as there are configuration
> details which change from one to the other. These are not only core and
> contrib but also external apps, like django-filebrowser for example, for
> which we have different upload limits per client; we use some 10 external
> apps or more.
>
> What we have been working on makes use of the threadlocals approach and a
> proxy object for settings values. This way, whenever some code is trying to
> get the value for a setting, the actual value is determined from the
> settings corresponding to the site being requested.
> All of this has worked very well to a certain extent, but we have had a
> very hard time figuring out which settings can actually be overridden at
> runtime and which can't.
>
> I believe that to achieve true multi-tenancy it should be made very clear
> when a setting is meant to stay unchanged and when it's OK to change it at
> runtime. The above mentioned ticket proposes this distinction for django
> settings but a complete resolution should also involve a strategy to allow
> third party app developers to easily make this same distinction in their own
> code. Eventually, apps could state if they are multi-tenancy compatible (all
> settings can be changed at runtime).
>
> Maybe an easy way to accomplish this separation would be to have dynamic
> and static settings live in different files, which would make it self
> explanatory. It would be up to the developer of each app to understand which
> of his settings can actually be changed at runtime ad which can't.
>
>
> What we have implemented ATM for our specific problem is a "man in the
> middle" (using twisted) which spawns server processes based on the requested
> site and only keeps alive a number of them and discards those that have been
> idle for a while. This is only useful in a situation like ours where most of
> the sites get very little hits per day, but it's been working just fine so
> far. The code (needs some love and generalization) is available at:
> http://bitbucket.org/san/luisito
>
>
>
>
>
> On Sun, Jan 30, 2011 at 3:39 PM, Daniel Moisset 
> <dmois...@machinalis.com>wrote:
>
>> On Sun, Jan 30, 2011 at 2:20 AM, Russell Keith-Magee
>> <russ...@keith-magee.com> wrote:
>> >
>> > Every single problem associated with using global variables exists
>> > with threadlocals -- and then a few more. They *can* be used
>> > successfully. However, in almost every case, they can also be avoided
>> > entirely with a good dose of rigorous engineering.
>> >
>> > I *strongly* advise against the use of this technique.
>> >
>>
>> I understand (and completely support) your objection, specially when
>> someone says «one could save even the request object to thread
>> "global" and it would be accessible anywhere.» (which would make code
>> using requests, i.e. a lot of it harder to reuse and to test)
>>
>> But the core problem being solved here, about moving SITE_ID to a
>> threadlocal, doesn't look like bad engineering to me. In fact is
>> moving something that is already global (everything in settings.py is)
>> to alocation which is *less* global (thread-wise instead of
>> process-wise). So this is an increase in locality, if I got it
>> right...
>>
>> In which way is this worse than the current state of a global
>> variable? (and in general, do you have some reference to explain
>> «Every single problem associated with using global variables exists
>> with threadlocals -- and then a few more»? I tend to think that a
>> thread local is generally better than a global, even if it tends to be
>> worse that good API design/argument passing)
>>
>> Regards,
>>    D.
>>
>> --
>> 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<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