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.
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
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---