WSGI:使用 AJAX 从 python 脚本中获取字符串

Posted

技术标签:

【中文标题】WSGI:使用 AJAX 从 python 脚本中获取字符串【英文标题】:WSGI: Use AJAX to get a string from a python script 【发布时间】:2011-07-06 05:45:37 【问题描述】:

我正在研究 WSGI,这非常困难。

我想做的事情很简单:当我点击一个链接时,我想从 python 脚本中获取字符串“hello”并在我的 HTML 段落元素中显示“hello”。

现在我制作了显示 html 文本的 WSGI python 脚本,即使用 WSGI python 提供页面,但没有将 Python、AJAX 和 WSGI 一起用于上述目的。

现在发生的情况是,当我单击 HTML 页面中的链接时,段落元素显示“错误”而不是“你好”。你认为我哪里错了;在 python 或 javascript 中?

我下面的python脚本正确吗?:

#!/usr/bin/env python

from wsgiref.simple_server import make_server
from cgi import parse_qs, escape

def application(environ, start_response):

   return [ "hello" ]

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    srv = make_server('localhost', 8000, application)
    srv.serve_forever()

也许是我的 Javascript 和/或 HTML 我错了?:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <script type="text/javascript">
    <!--
        function onTest( dest, params )
        
            var xmlhttp;

            if (window.XMLHttpRequest)
            // code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            
            else
            // code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            

            xmlhttp.onreadystatechange=function()
            
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                
                    document.getElementById( "bb" ).innerHTML = xmlhttp.responseText;
                
            

            xmlhttp.open("POST",dest,true);
            xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xmlhttp.send( params ); 
        


    -->
    </script>
</head>

<body>

    <p id="bb"> abcdef </p>
    <a href="javascript:onTest('aaa.py', '')">Click it</a>

</body>

</html>

我测试它的步骤: - 运行 wsgi 假服务器脚本 - 打开浏览器并输入http://localhost:8000/test.html - 单击 html 页面中的链接并返回“错误”

我的文件 wsgi.py、aaa.py 和 test.html 都在同一个文件夹中。

我的服务器: 导入线程 导入浏览器 导入操作系统 从 wsgiref.simple_server 导入 make_server

FILE = 'index.html'
PORT = 8000

def test_app(environ, start_response):

    if environ['REQUEST_METHOD'] == 'POST':

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

        try:
            response_body = str(int(request_body) ** 2)
        except:
            response_body = "error"

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

    else:
        f = environ['PATH_INFO'].split( "?" )[0]
        f = f[1:len(f)]
        response_body = open(f).read()
        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():
    """Start the server."""
    httpd = make_server("", PORT, test_app)
    httpd.serve_forever()


if __name__ == "__main__":
    open_browser()
    print "Now serving on Port 8000"
    start_server()

【问题讨论】:

【参考方案1】:

你没有打电话给start_response。使用如下调用:

start_response("200 OK", [('Content-type','text/plain')])

【讨论】:

谢谢。如果我提供自己的页面,我运行脚本,然后在我的浏览器中输入localhost:8000,那么它可以工作,但是当我运行我的假 wsgi 服务器时它不起作用,然后在浏览器中运行我的 html 页面并单击链接.我仍然得到“错误”。也许我的服务器有问题(请参阅服务器问题)? 在哪里?还是这个答案已经过时了?我在上面的代码 sn-ps 中看到了start_response(),所以我不确定你的建议是什么。 @dwanderson 在我的回答帮助下,他编辑了他的问题。见***.com/posts/5150339/revisions。【参考方案2】:

错误似乎来自 python 脚本。检查 aaa.py 是否可以直接使用 IE 或其他浏览器访问。

【讨论】:

来自@Matthew Flaschen 的回答,python 脚本在我运行它然后输入 http...:8000 时有效,所以我认为脚本没问题,但我不确定我应该提供什么服务? 似乎有点连线,我建议你在点击test.html中的锚点后使用firefox和firebug来监控网络。现在你使用'POST'方法来上传数据,你可以尝试使用'GET'来代替吗?【参考方案3】:

httpd.serve_forever()

必须在功能块之外

【讨论】:

【参考方案4】:

您不能在此处使用“aaa.py”作为帖子网址。然后服务器将查看该文件的根目录。例如本地主机/aaa.py。您必须提供服务器根目录的完整路径(不包括服务器根路径)

例如如果文件位于 /var/www/wsgi-scripts/aaaa.py 那么 url 应该是 /wsgi-scripts/aaaa.py。

【讨论】:

以上是关于WSGI:使用 AJAX 从 python 脚本中获取字符串的主要内容,如果未能解决你的问题,请参考以下文章

目标 WSGI 脚本无法作为 Python module.Flask.Apache 加载

目标 WSGI 脚本 '/opt/python/current/app/application.py' 不包含 WSGI 应用程序 'application'

WSGI 脚本无法作为 Python 模块加载——500 内部服务器错误

我该如何解决这个问题? mod_wsgi (pid=3445): 目标 WSGI 脚本 '/www/folder/index.py' 不能作为 Python 模块加载

无法使用 mod_wsgi 从 python wsgi 连接到 pymssql

从 AJAX 或 JQuery 运行 Python 脚本