Search code examples
javascriptajaxtwisted

Ajax POST doesnt work / Twisted


Twisted.Web and AJAX Similar thread already exits . I even took code from there , yet i have the same problem , the twisted server works like a charm, but can't figure out why i can't fetch it with ajax. In similar thread he says that alert comes out , but without data. For me even alert doesn't pop up , yet another ajax functions works , so in general with ajax is everything ok , but exactly with fetching something goes wrong.

As also said in similar thread i can fetch it with curl - $ curl --url http://localhost:8082/test -v , and it shows hello world , so servers works fine 100 % .

Any ideas ?

<script type="text/javascript">
// Submit button
$(function(){
  $.ajax({type: "POST", 
     $('a').click(function(){
        url: "http://localhost:8082/test",
        data: {},
        success: function(data) {alert("Success:" + data);}
    });
  });
});
</script>

<html>
[...]
  <a href="#">Load Favorites Movies</a>...
[...]
</html>

server.py

from twisted.web import server, resource, http

class RootResource(resource.Resource):
    def __init__(self):
        resource.Resource.__init__(self)
        self.putChild('test', TestHandler())

class TestHandler(resource.Resource):
    isLeaf = True

    def __init__(self):
        resource.Resource.__init__(self)
    def render_GET(self, request):
        return self.render_POST(request)
    def render_POST(self, request):
        return "hello world!"

if __name__ == "__main__":
    import sys
    from twisted.internet import reactor
    reactor.listenTCP(8082, server.Site(RootResource()))
    reactor.run()

Big thank you to Peter Le Bek and Darkporter. Peter Le Bek asnwer marked as correct , and Darkporter vote up =) from me .

Answer : Peter's answer works out of the box , just the thing that confused me a little bit was the line , where you had to specify the static folder. It is easy ... just sepcify any folder there , put there index.html and it will a root directory , when you access it on the web.


Solution

  • Your javascript is mangled, try this:

    wwwdir/index.html

    <html>
     <head>
      <script src="http://code.jquery.com/jquery-1.5.2.min.js"></script>
     </head>
     <body>
      <a href="#">click me</a>
      <script type="text/javascript">
       $('a').click(function(){
        $.ajax({type: "POST",
                url: "http://localhost:8082/test",
                data: {},
                success: function(data) { alert("Success: " + data); }
        });
       });
      </script>
     </body>
    </html>
    

    You'll probably still meet the cross-domain HTTP request restriction mentioned by darkporter, to solve this serve your webpage using the same Twisted server:

    server.py

    from twisted.web import server, resource, http, static
    
    class TestHandler(resource.Resource):
        isLeaf = True
    
        def __init__(self):
            resource.Resource.__init__(self)
        def render_GET(self, request):
            return self.render_POST(request)
        def render_POST(self, request):
            return "hello world!"
    
    if __name__ == "__main__":
        import sys
        from twisted.internet import reactor
    
        root = static.File('/path/to/wwwdir')
        testHandler = TestHandler()
        root.putChild('test', testHandler)
        reactor.listenTCP(8082, server.Site(root))
        reactor.run()