0

我是 WSGI 和 jQuery 的新手,因此,我正在寻找一个使用这两种设备组合的简单示例。我已经花了几个小时在这个主题中找到一些东西,但没有取得任何重大成功:这个问题是一个很好的起点:如何在 Python 中实现 AJAX 的最小服务器?,但是,目前我不知道如何修改它以便在其中使用 jQuery。

如果您能给我一些提示,我将不胜感激。先感谢您!

4

2 回答 2

1

jQuery 在客户端浏览器中运行,因此您不必修改链接到的代码。但我建议使用它而不是滚动你自己的 python 服务器:

http://flask.pocoo.org/

使用其他人的代码的最小版本更容易使用。Plus 直接支持 AJAX 类型的命令,并有文档说明:

http://flask.pocoo.org/docs/patterns/jquery/

所以,简而言之,你最终会得到两个处理程序(可以访问的 URLS)

Mainhandler Ajaxhandler

“前端”将通过转到 Mainhandler 来提供服务。但是当用户点击一个按钮时,比如说,jQuery 会创建一个对“Ajaxhandler”的调用,获取一些新数据并使用这些新数据直接更新网页。并且该处理程序知道返回可用于更新页面的少量数据,而不是替换它。

就是这样。

所以你会有一些 javascript (jQuery) 然后实际上做了 ajaxy 位。

 /* Send the data using post and put the results in a div */
    $.post( url, { s: term },
            function( data ) {
                var content = $( data );
                $("#result").empty().append( content );
                $("#result").fadeIn();
                $("#s").attr('value', ''); /* reset search text box */

因此,当用户单击按钮时,会向服务器发出发布请求,检索结果并清空 div,然后使用新值进行更新,并且不会在网页全局更改的情况下进行更新。阿贾克斯!

于 2012-09-11T08:57:22.750 回答
0

经过扩展研究,我得出了以下示例。WSGI文件:

import threading
import webbrowser
from wsgiref.simple_server import make_server
from cgi import parse_qs

FILE = 'frontend.html'
PORT = 8080

def test_app(environ, start_response):

    path = environ.get('PATH_INFO', '').lstrip('/')      #get path

    if ("static" in path):                               #handle query for
        status = '200 OK'                                #files in /static
        headers = [('Content-type', 'text/javascript')]
        start_response(status, headers)
        f2serv=file(path,'r')                            #read file 
    return environ['wsgi.file_wrapper'](f2serv)          #return file

    if environ['REQUEST_METHOD'] == 'POST':              #If POST...
        try:
            request_body_size = int(environ['CONTENT_LENGTH'])
            request_body = environ['wsgi.input'].read(request_body_size)
        except (TypeError, ValueError):
            request_body = "0"

        parsed_body = parse_qs(request_body)    
        value = parsed_body.get('test_text', [''])[0] #Returns the first value

        try:
            response_body = str(int(value) ** 2)
        except:
            response_body = 'error'

        status = '200 OK'
        headers = [('Content-type', 'text/plain')]
        start_response(status, headers)
        return [response_body]

    else:                                             #If not POST, just pass
        response_body = open(FILE).read()             #the html file itself
        status = '200 OK'
        headers = [('Content-type', 'text/html'),
                   ('Content-Length', str(len(response_body)))]
        start_response(status, headers)
        return [response_body]

def open_browser():
    # Start a browser after waiting for half a second
    def _open_browser():
        webbrowser.open('http://localhost:%s/%s' % (PORT, FILE))
    thread = threading.Timer(0.5, _open_browser)
    thread.start()

def start_server():   
    httpd = make_server("", PORT, test_app)
    httpd.serve_forever()

if __name__ == "__main__":
    open_browser()
    start_server()

html 文件(名为“frontend.html”):

<html>
    <head>
        <title>AJAX test</title>
    </head>
    <body>
        <script src="static/jquery-1.8.1.js"
            type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            function submit(){
            $.post( "?", { test_text : $("#test_text").val() },
                function( data ) {
                $('#test_result').html(data);});
            };
        </script>
        square(
        <input type="text" name="test_text" id="test_text" value="0" size="4">
        ) =
        <span id="test_result">0</span>
        <input type="button" value="compute"
            title="compute" onclick="submit();"/>
    </body>
</html>

重要提示:为了使上面的示例正常工作,必须将 jquery.js 的实际版本复制到 /static 下(在本例中为 static/jquery-1.8.1.js)。

于 2012-09-11T11:41:36.747 回答