如何在cherrypy app中使用ajax调用python脚本

时间:2014-09-03 00:56:24

标签: python ajax cherrypy

我正在尝试从python脚本获取输出并将其放入我的cherrypy应用程序的html中的表中。

示例app:

import string, os
import cherrypy

file_path = os.getcwd()

html = """<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="content-type">
<title>CCMF</title>
<link rel='shortcut icon' type='image/x-icon' href='img/favicon.ico' />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<script>
    function b1() {
        var request = $.ajax({
            url: "b1.py",
            type: "POST",            
            dataType: "text"
        });
        request.done(function(msg) {
            $("#output").html(msg);          
        });
        request.fail(function(jqXHR, textStatus) {
            alert( "Request failed: " + textStatus );
        });
    }
</script>

</head>
<button onclick="b1()">call b1.py</button>
...
<td id = "output"; style="vertical-align: top; height: 90%; width: 100%;">
<--output goes here -->
</td>
...
</html>
"""
class ccmf(object):

    @cherrypy.expose
    def index(self):
    return html

if __name__ == '__main__':
    cherrypy.server.socket_host = "127.0.0.1"
    cherrypy.server.socket_port = 8084
    config = {
         "/img": {
             "tools.staticdir.on": True,
             "tools.staticdir.dir": os.path.join(file_path, "img"),
         }
    }
    cherrypy.tree.mount(ccmf(), "/", config=config)
    cherrypy.engine.start()
    cherrypy.engine.block()

这是示例python脚本b1.py:

def b1():
    op = "ajax b1 pushed"
    print op
    return op

b1()

调用ajax get但返回失败警报。我试过GET,POST,“text”,“html”,b1.py在同一目录下,没有快乐。目前所有这些都在我的本地邮箱上运行。

任何提示都非常感谢!

1 个答案:

答案 0 :(得分:6)

你完全误解了CherryPy的现代化,例如路由的工作原理。与通常与CGI和Apache的mod_ *(mod_php,mod_python等)一起使用的过时方法不同,现在路由是一种应用程序级活动。在这种方法中,您直接指向包含URL脚本的文件。

您的应用程序会收到所有请求,并按照既定方法发送它们。 CherryPy在这个意义上有两种主要方法:built-in object tree dispatcherRoutes adapter。对于大多数简单和中级案例,内置调度程序是公平的。

基本上它看起来像这样。

app.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import os

import cherrypy
from cherrypy.lib.static import serve_file


path   = os.path.abspath(os.path.dirname(__file__))
config = {
  'global' : {
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8
  }
}

class App:

  @cherrypy.expose
  def index(self):
    return serve_file(os.path.join(path, 'index.html')) 

  @cherrypy.expose
  @cherrypy.tools.json_out()
  def getData(self):
    return {
      'foo' : 'bar',
      'baz' : 'another one'
    }


if __name__ == '__main__':
  cherrypy.quickstart(App(), '/', config)

的index.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=utf-8'>
<title>CCMF</title>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script>
<script type='text/javascript'>
  $(document).ready(function()
  {
    $('button').on('click', function()
    {
      var request = $.ajax({'url': '/getData'});
      request.done(function(response) 
      {
        $('#foo').text(response.foo);
        $('#baz').text(response.baz);
      });
      request.fail(function(jqXHR, textStatus) 
      {
        alert('Request failed: ' + textStatus);
      });
    })
  });
</script>
</head>
<body>
  <button>make ajax call</button>
  <h1>Foo</h1>
  <div id='foo'></div>
  <h1>Baz</h1>
  <div id='baz'></div>
</body>
</html>

以下是the runnable以防万一。