2014-09-03 1 views
2

Я пытаюсь получить вывод из скрипта python и поместить его в таблицу в html моего вишневого приложения.Как вызвать скрипт python с ajax в приложении cherrypy

Пример приложение:

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() 

и вот пример питона скрипт b1.py:

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

b1() 

Аякс прибудет называеться но возвращает предупреждение отказов. Я пробовал GET, POST, «текст», «html», b1.py находится в одном каталоге, без радости. Все в настоящее время работают в моем локальном поле.

Подсказки приветствуются!

+0

Я думаю, что ваш дизайн испорчен. Попробуйте сделать функцию b1 функцией, возвращающей HTTPResponse. – Dan

+0

Это может быть правдой, но, похоже, это тоже проблема пути. Если я посмотрю в разделе Инструменты> Веб-разработчик> Netwok в Firefox, когда я нажимаю кнопку, я получаю 404. Я попробовал добавить каталог cgi-bin и поместить туда b1.py и добавил «/ cgi-bin»: { «tools.staticdir.on»: True, «tools.staticdir.dir»: os.path.join (file_path, «cgi-bin») в конфигурацию, но он все еще считает cwd/cgi-bin/b1. py не существует. – user3891489

+0

ОК, я бросил черри и я обслуживаю html-файл из apache. Теперь, когда я нажимаю кнопку, я получаю содержимое b1.py вместо того, чтобы запускать его и выдавать правильный результат. Один шаг за один раз. – user3891489

ответ

5

Вы полностью не понимаете, как современные, например, ЧерриПи, работают в маршрутизации. В отличие от устаревших подходов, которые обычно используются в CGI и Apache mod_ * (mod_php, mod_python и т. Д.), Где вы прямо указываете на файл, содержащий скрипт с URL-адресом, современная маршрутизация - это активность на уровне приложения.

Ваше приложение получает все запросы и отправляет их в соответствии с установленным методом. CherryPy в этом смысле имеет два основных подхода: built-in object tree dispatcher и Routes 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 на всякий случай.

+0

Спасибо, что и работает, и упрощает вещи! :) – user3891489