You are modifying the settings on runtime , that practise is not
recommended by django and personally i have had bad experience with that...
El 24/10/2012 00:26, "Marty Woodlee" <marty.wood...@gmail.com> escribió:

> So the straw man solution we've implemented for now looks like this.
> (Background: we have a settings.THREADLOCALS construct which serves in a
> capacity similar to Ned's global requests; also, our monkeypatch_method
> decorator does what you probably think it does.) First, we've a tiny bit of
> middleware:
>
> from django.conf import settings
>
> class RequestURIMiddleware:
>     """
>     Set the request URI in THREADLOCALS so that it can be used to comment
>     SQL queries with what triggered them.
>     """
>     def process_request(self, request):
>         settings.THREADLOCALS.request_uri = request.build_absolute_uri()
>
> And then we've monkeypatched the cursor method on BaseDatabaseWrapper like
> so:
>
> from django.conf import settings
> from django.db.backends import BaseDatabaseWrapper, util
> from patchers import monkeypatch_method
> import traceback
>
> class CommentingCursorWrapper(util.CursorDebugWrapper):
>     def execute(self, sql, *args, **kwargs):
>         """
>
>         Before sending to the DB, this adds a comment to the SQL with notes 
> about the query's origin
>         """
>         try:
>             if getattr(settings, 'SQL_COMMENTS_ALWAYS_TRACEBACK', False):
>                 raise AttributeError
>
>             # THREADLOCALS.request_uri is (usually) populated by 
> RequestURIMiddleware
>
>             origin_comment = ' /* Originated from request to 
> {0}'.format(settings.THREADLOCALS.request_uri)
>         except AttributeError:
>
>             # If no URI available (e.g., Celery task), report the first 
> non-Django point in the call stack:
>
>             tb = reversed(traceback.format_stack()[:-1])  # walk it 
> bottom-up, excluding this frame
>             for frame in tb:
>                 if 'django' not in frame:
>
>                     origin_comment = ' /* Originated 
> at{0}'.format(frame.split('\n')[0])
>                     break
>         origin_comment = origin_comment.replace('%', '%%')
>         origin_comment = origin_comment.replace('*/', '\*\/')
>         sql += origin_comment + ' */'
>         return self.cursor.execute(sql, *args, **kwargs)
>
>
> @monkeypatch_method(django.db.backends.BaseDatabaseWrapper)
> def cursor(self, *args, **kwargs):
>
>     return CommentingCursorWrapper(cursor._original_cursor_function(self, 
> *args, **kwargs), self)
>
>
> So in short, we comment the SQL with the URI when it's available, and fall
> back to the (presumably more expensive to gather) traceback information
> when it's not.
>
> This is just the monkeypatch we're throwing in to solve our immediate
> problem, but it'd be easy enough to convert into a patch. Before we do, any
> thoughts/criticisms of this approach?
>
> Best,
> Marty
> http://www.mapmyfitness.com/profile/woodlee/
>
> On Monday, October 22, 2012 11:23:47 PM UTC-5, Matt McClure wrote:
>>
>> Thanks, Russell. That's similar to the approach we were thinking of
>> implementing. Hopefully we'll have a straw man to share shortly.
>>
>> Matt
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Django developers" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/django-developers/-/-X0AFXuzDv8J.
> 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.
>

-- 
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