Thanks for all your help!

Now I understand web2py a little better :-)
Since I do not want to add to each insert the appending
of the function - I simply added it after creating the table
in the model, and now it works well since it is being executed
together with the model code. 

Are there good reasons not to do it?

Since I use web2py mainly as a back-end to JSON-RPC calls and gateway to 
the database,
my application is basically built out of a huge default controller and a 
huge model file. I don't
think I would know where to put it otherwise.

Best wishes,
Omri

On Monday, June 11, 2012 6:25:15 PM UTC+2, Anthony wrote:
>
> Model (i.e., DAL Table) definitions do not survive across requests -- 
> during a request, you define the table, and then you use the table object 
> to access the db, etc. In your workflow, you are adding the _after_insert 
> function in one request (i.e., the RPC request) but doing the insert in a 
> separate request. This is not how web2py works -- you have to add the 
> _after_insert function in the same request as the insert.
>
> More generally, keep in mind that your application code is executed on 
> each request -- whatever you define in a given request is specific to that 
> request and does not persist to subsequent requests (unless, of course, you 
> explicitly store it in the cache, session, db, filesystem, etc.).
>
> Anthony
>
> On Monday, June 11, 2012 11:56:36 AM UTC-4, Omri Har-Shemesh wrote:
>>
>> In order to attach the function, I have a function which is being called 
>> through JSON-RPC, and looks like this:
>>
>> @service.jsonrpc
>> def append_listeners():
>>    print db.comments._after_insert  # prints []
>>    db.comments._after_insert.append(MyFunction)
>>    print db.comments._after_insert  # prints [<function MyFunction at 
>> 0xabfb8df4>]
>>
>> No matter how many times I call this function, the print statements stay 
>> the same (except for the address of the function MyFunction).
>> I modified the insert function in dal.py for debugging:
>>     def insert(self, **fields):
>>         print "_after_insert array: ", self._after_insert  # prints 
>> _after_insert array:  []
>>         print "table name: ", self._tablename # prints table name: 
>> comments
>>         self._attempt_upload(fields)
>>         if any(f(fields) for f in self._before_insert): return 0
>>         ret =  self._db._adapter.insert(self,self._listify(fields))
>>         ret and [f(fields,ret) for f in self._after_insert]
>>         return ret
>>
>> and indeed, when I insert something to the comments table, I get two 
>> lines printed out as shown in the comments text.
>> It seems that the additional function is not saved in the table object.
>>
>> Am I doing something fundamentally wrong? Should I add the function from 
>> the model file? Or at any other place?
>>
>> Thanks,
>> Omri
>>
>>
>>
>> On Monday, June 11, 2012 5:33:53 PM UTC+2, Anthony wrote:
>>>
>>> I tried adding a method using:
>>>> def SomeMethod(fields,res):
>>>>     print "inside SomeMethod"
>>>>
>>>> db.my_table._after_insert.append(SomeMethod)
>>>>
>>>> but nothing seems to happen. Is it possible that the implementation of 
>>>> the adapters
>>>> does not call the methods inside _after_insert, _after_update and 
>>>> _after_delete?
>>>>
>>>
>>> I would think it should work. Have you also defined any _before_insert 
>>> functions -- if they return anything, the insert will be aborted? Also, are 
>>> you sure the insert is happening -- if not, the _after_insert functions 
>>> won't run. You may need to show more code.
>>>
>>> Anthony 
>>>
>>

Reply via email to