On 7/25/07, Andrey Khavryuchenko <[EMAIL PROTECTED]> wrote:
>
> Nimrod,
>
>  NAA> On 7/25/07, Andrey Khavryuchenko <[EMAIL PROTECTED]> wrote:
>  >> >> Yes, I read carefuly your question and thought the answer was
>  >> >> straighforward.   I don't understand why you don't want decorators, 
> but you
>  >> >> could just check the decorator definition to read what it does and copy
>  >> >> it's code.  All you need is decorator name and grep over django 
> sources :)
>  >>
>  NAA> Aren't decorators usable only in views?
>  >>
>  >> Decorators are python feature.  Django views are regular functions, just 
> as
>  >> any other.
>
>  NAA> Sorry I wasn't very clear on that last message, I meant the Django
>  NAA> db.transactions decorator functions. I am thinking they only work when
>  NAA> you use them in a view. When you try to use them elsewhere, e.g. a
>  NAA> Django-based command line app, see below...
>
> No, you're wrong.  Transaction decorators work not only in view functions.
> They work anywhere in the web app, provided transaction middleware is
> included.

Ah, there we go :) but that's for web apps, though I must admit that I
have never really tried adding decorators to non-view methods. But now
that you mention it, I have a few non-view method call that need it.
So thanks for pointing that out.

After mucking around in the Django sources, I eventually figured out
that I needed the calls to enter_transaction_management() and friends
from within the command line app.

>  NAA> At least that's what I think.  I have a project that required a
>  NAA> separately running process (running as daemon) that needed access to
>  NAA> the Django models. Since the code in the daemon is not run in the
>  NAA> context of a view (no triggering of TransactionMiddleware),
>  NAA> transactions decorators do not work. I get:
>  >>
>  NAA> TransactionManagementError: This code isn't under transaction management
>  >>
>  >> Not having read transaction code, can't say what haven't worked in your
>  >> case.  Definitely, something wasn't initialized :)
>
>  NAA> You're right. The app I am talking about is not a web app, rather a
>  NAA> command line app that I made as a supplement to the web app I made
>  NAA> using Django. Since it makes no sense to reinvent the wheel, I just
>  NAA> used Django's ORM system in the command line app. When I tried using
>  NAA> transactions using the transaction decorator functions I get the error
>  NAA> above. Likely cause is that the command line app is not using
>  NAA> middleware, ergo not using TransactionMiddleware, then I needed a way
>  NAA> to initialize and manage transactions manually.
>
> A ticket in my queue is similar, so I understand you perfectly.
>
> Quick glance on django.middleware.transaction shows:
>
>     def process_request(self, request):
>         """Enters transaction management"""
>         transaction.enter_transaction_management()
>         transaction.managed(True)
>
>     def process_exception(self, request, exception):
>         """Rolls back the database and leaves transaction management"""
>         if transaction.is_dirty():
>             transaction.rollback()
>         transaction.leave_transaction_management()
>
>     def process_response(self, request, response):
>         """Commits and leaves transaction management."""
>         if transaction.is_managed():
>             if transaction.is_dirty():
>                 transaction.commit()
>             transaction.leave_transaction_management()
>         return response
>
> So in cmd line app you have to call
>    transaction.enter_transaction_management()
>    transaction.managed(True)
> in initialization and
>    transaction.leave_transaction_management()
> in the end.  Not tested, but should work.
>
> --
> Andrey V Khavryuchenko
> Django NewGate -  http://www.kds.com.ua/djiggit/
> Development - http://www.kds.com.ua
> Call akhavr1975 on www.gizmoproject.com
>
> >
>


-- 
_nimrod_a_abing_

http://abing.gotdns.com/
http://www.preownedcar.com/

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

Reply via email to