views:

109

answers:

1

I have 3 AJAX functions to move data between a Django app on my website and some JavaScript using YUI in the browser. There is not a major difference between them in terms of their structure, concept, code, etc. 2 of them work fine, but in the 3rd one, I get one spurious HTTP request immediately after the intended request. Its POST data contains a subset of the POST data of the intended request. The request meta data is identical except for the CONTENT_LENGTH (obviously) and the CONTENT_TYPE which is 'text/plain; charset=UTF-8' for the intended and 'application/x-www-form-urlencoded' for the unwanted request. I do not set the content type explicitely at all which seems to suggest both requests do not have the same origin and the second one just pops out of thin air.

The intended request sets HTTP_CACHE_CONTROL': 'no-cache' and 'HTTP_PRAGMA': 'no-cache', the spurious one does not. The dev server log output for both requests is

[15/Feb/2010 15:00:12] "POST /settings/ HTTP/1.1" 200 0

What does the last 0 at the end mean ? Could not find any documentation on that. This value is usually non-zero... In Apache, it is the total size in bytes of the server response, can someone confirm it's the same for Django ?

My problem obviously is to find out where this additional request comes from.

I am fairly familiar with JS debugging using Firebug and I think I'm good at Python and Django, but I do not know a lot about the internals of HTTP requests and responses. I can breakpoint and step through the JS code that sends the intended XMLHTTP request, but that breakpoint does not get hit again.

The problem occurs with both FF3 and Safari, I'm on Snow Leopard, so I can't test with IE or Chrome. I've looked at Django debugging techniques and tools like http://robhudson.github.com/django-debug-toolbar/ but I think I already have the information they can give me.

Can someone advise on a strategy or a tool to narrow the problem down ?

+1  A: 

The problematic AJAX function submits form data, the working two don't. Forms have a default action which takes place when the form is submitted: post a request with the form data. I failed to prevent this default action.

So the spurious request did indeed come out of the dark underwood of the browser, there is no code in my js files that sends it.

Solution:

YAHOO.util.Event.preventDefault(event);

at the beginning of the form submit event handler.

See also http://developer.yahoo.com/yui/examples/event/eventsimple.html

ssc