Skip to main content
 首页 » 编程设计

jquery之使用 Cherrypy 和 jQuery/AJAX 从 Python 获取数据

2024年11月01日31TianFang

不幸的是,我没有让 ajax 与 cherrypy 一起正常工作。 这是我的 Python 代码:

from mako.template import Template 
from mako.lookup import TemplateLookup 
import cherrypy 
import os 
import json 
 
CURDIR = os.getcwd() 
 
cherrypy.config.update({ 
    "tools.staticdir.root" : CURDIR, 
    "tools.staticdir.dir" : "static", 
    "tools.staticdir.on" : True 
    }) 
 
# Loopuoobjekt für die Templates 
tmplLookup = TemplateLookup(directories=['templates']) 
# Liefert das Gerenderte Template zurück 
def serve_template(templatename, **tmpl_vars): 
    template = tmplLookup.get_template(templatename) 
    return template.render(**tmpl_vars) 
 
class Root(object): 
    @cherrypy.expose 
    def index(self): 
        return serve_template("index.html") 
 
    @cherrypy.expose 
        def switch(self, id): 
        print("Licht nr {} wurde geschaltet".format(id)) 
        cherrypy.response.headers["Content-Type"] = "application/json" 
        return json.dumps({"text" : "schalter {} ".format(id)}) 
 
cherrypy.quickstart(Root()) 

这是我的 html 模板:

<html> 
<head> 
    <script src="jquery.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
    $(document).ready(function() { 
        $("button").click(function() { 
            $.ajax({ 
                url: "switch", 
                type: "POST", 
                data: {id: $(this).attr('id')}, 
                succes: function(response) { 
                    $("#test").html(response); 
                }  
            }); 
        }); 
    }); 
    </script> 
</head> 
<body> 
    <h1>Hallo Haus!</h1> 
    <button id=1>Licht 1</button> </br> 
    <button id=2>Licht 2</button> </br> 
    <button id=3>Licht 3</button> </br> 
    <button id=4>Licht 4</button> 
 
    <div id=test></div> 
 
</body> 
</html> 

如果我按下这 4 个按钮中的一个,我会在我的控制台中打印出正确的 ID。 上面的例子

return json.dumps({"text" : "schalter {} ".format(id)}) 

写在我发现的最多的教程上,但不幸的是这给了我一个错误:

[09/Apr/2014:15:36:57] HTTP Traceback (most recent call last): 
File "C:\Python33\lib\site-packages\cherrypy-3.2.4-py3.3.egg\cherrypy\_cprequ 
est.py", line 656, in respond 
    response.body = self.handler() 
  File "C:\Python33\lib\site-packages\cherrypy-3.2.4-py3.3.egg\cherrypy\_cprequ 
est.py", line 814, in __set__ 
raise ValueError(self.unicode_err) 
ValueError: Page handlers MUST return bytes. Use tools.encode if you wish to re 
turn unicode. 

因此数据已成功发送到 cherrypy,但我没有取回。 任何帮助如何让它工作?

请您参考如下方法:

尝试将@cherrypy.tools.json_out() 添加到您的开关处理程序...

import cherrypy 
import os 
import json 
 
CURDIR = os.getcwd() 
 
cherrypy.config.update({ 
    "tools.staticdir.dir" : CURDIR, 
    "tools.staticdir.on" : True 
    }) 
 
# Loopuoobjekt für die Templates 
 
# Liefert das Gerenderte Template zurück 
class Root(object): 
    @cherrypy.expose 
    def index(self): 
        return """<html> 
<head> 
<script src="jquery.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $("button").click(function() { 
        $.ajax({ 
            url: "switch", 
            type: "POST", 
            data: {id: $(this).attr('id')}, 
            success: function(response) { 
                alert(response); 
                $("#test").html(response); 
            }  
        }); 
    }); 
}); 
</script> 
</head> 
<body> 
    <h1>Hallo Haus!</h1> 
    <button id=1>Licht 1</button> </br> 
    <button id=2>Licht 2</button> </br> 
    <button id=3>Licht 3</button> </br> 
    <button id=4>Licht 4</button> 
 
    <div id=test></div> 
 
</body> 
</html>""" 
 
    @cherrypy.expose 
    @cherrypy.tools.json_out() 
    def switch(self, id): 
        print("Licht nr {} wurde geschaltet".format(id)) 
        return json.dumps({"text" : "schalter {} ".format(id)}) 
 
cherrypy.quickstart(Root()) 

希望这对您有所帮助!