当前位置: 首页 > 面试题库 >

如何在Python中为AJAX实现最小服务器?

于鹏
2023-03-14
问题内容

我想为Python程序创建一个非常简单的基于HTML /
AJAX的GUI。因此,前端是一个HTML页面,可通过AJAX与程序进行通信。您能否使用python给我提供服务器端的最小实现SimpleHTTPServer.SimpleHTTPRequestHandler

一个简单的示例是文本字段和按钮。当按下按钮时,该字段的内容将发送到服务器,然后服务器将相应的答案发送回去。我知道Python中有许多强大的解决方案,但是我想保持它非常简单。我已经找到了这种服务器的一些很好的例子(例如here),但是到目前为止,我还无法提出一个真正最小的例子。

如果您想知道为什么我要以这种方式实现GUI:此应用程序的重点是在交互最少的情况下以美观的布局显示大量数据-因此使用HTML +
CSS似乎最方便(而且我已经用于非交互式数据显示)。


问题答案:

好的,我想我现在可以回答我自己的问题。这是用于在服务器上计算数字平方的示例实现。如果有任何改进或误解,请告诉我。

python服务器文件:

import threading
import webbrowser
import BaseHTTPServer
import SimpleHTTPServer

FILE = 'frontend.html'
PORT = 8080


class TestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    """The test example handler."""

    def do_POST(self):
        """Handle a post request by returning the square of the number."""
        length = int(self.headers.getheader('content-length'))        
        data_string = self.rfile.read(length)
        try:
            result = int(data_string) ** 2
        except:
            result = 'error'
        self.wfile.write(result)


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."""
    server_address = ("", PORT)
    server = BaseHTTPServer.HTTPServer(server_address, TestHandler)
    server.serve_forever()

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

…和HTML文件(我称之为“ frontend.html”,不幸的是,该名称也必须出现在JavaScript代码中):

<html>
<head>
<title>AJAX test</title>
</head>
<body>
<script type="text/javascript">

function xml_http_post(url, data, callback) {
    var req = false;
    try {
        // Firefox, Opera 8.0+, Safari
        req = new XMLHttpRequest();
    }
    catch (e) {
        // Internet Explorer
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
    req.open("POST", url, true);
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
            callback(req);
        }
    }
    req.send(data);
}

function test_button() {
    var data = document.test_form.test_text.value;           
    xml_http_post("frontend.html", data, test_handle)
}

function test_handle(req) {
    var elem = document.getElementById('test_result')
    elem.innerHTML =  req.responseText
}

</script>

<form name=test_form>
sqr(
<input type="text" name="test_text" value="0" size="4">
) =
<span id="test_result">0</span>
<input type=button onClick="test_button();" value="start" title="start">
</form>

</body>
</html>

当然,将jQuery用于XML请求会更加方便,但是为了简单起见,我将其保留为原来的样子。

最后,使用WSGI的另一种实现(不幸的是,如果请求不是POST的话,我看不到依靠标准文件服务处理程序的方法):

import threading
import webbrowser
from wsgiref.simple_server import make_server

FILE = 'frontend.html'
PORT = 8080

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:
        response_body = open(FILE).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()
    start_server()


 类似资料:
  • 问题内容: 我实际上正在从事一个网站项目。我是Web服务的新手。我在面向对象的编程(java,c#,…)方面有4年的经验。我已经阅读了很多有关Web服务的文章,但是我的文档都没有告诉您如何使用所有技术来制作一个真正的Web服务项目。 我要做的是:1.使用Java映射到JPA的MySQL后端;2.使用Web服务来提供…的某些功能(JBoss,…有很多可能性,我不知道应该选择哪种方式)3.创建一个动态

  • 我正在测试一些使用JWindow和隐藏jframe的代码,所以我必须创建最小化、最大化和关闭按钮,以方便用户使用。单击创建的按钮时,如何将状态设置为帧。

  • 我想我错过了一些关于如何在JavaMail中搜索的内容。 从文件夹下载空邮件 创建与结果匹配的新搜索词 使用搜索词筛选(yourFolder.search)结果 这是可行的。但是,为什么要这样做?如果我使用javamail连接到gmail之类的东西,搜索不会在服务器端执行,而且使用整个javax似乎没有任何优势。邮政搜索SearchTerm构建在提高效率或减少需要通过网络发送的数据量方面。。。 我

  • 这个问题和这里问的一样。 给定一个硬币列表,它们的值(c1,c2,c3,... cj,...),以及总和i。找出硬币总数为i的最小数量(我们可以根据需要使用一种类型的硬币),或者报告不可能以总和为S的方式选择硬币。 我昨天刚刚被介绍到动态编程,我试图为它编写一个代码。 这里,C[i]是货币量“i”的最优解。可用的硬币有{c1,c2,…,cj,…}对于这个程序,我增加了递归限制,以避免最大递归深度超

  • 问题内容: 我正在尝试使用Flask微网络框架上的服务器推送功能构建一个小型站点,但是我不知道是否有可以直接使用的框架。 我使用了Juggernaut,但在当前版本中似乎无法与redis-py一起使用,并且最近不推荐使用Juggernaut。 有人对我的案子有建议吗? 问题答案: 该协议非常简单。只需将mimetype添加到你的响应中即可。浏览器将保持连接打开并监听更新。从服务器发送的事件是一行文

  • 本文向大家介绍如何在 Java 中利用 redis 实现 LBS 服务,包括了如何在 Java 中利用 redis 实现 LBS 服务的使用技巧和注意事项,需要的朋友参考一下 前言 LBS(基于位置的服务) 服务是现在移动互联网中比较常用的功能。例如外卖服务中常用的我附近的店铺的功能,通常是以用户当前的位置坐标为基础,查询一定距离范围类的店铺,按照距离远近进行倒序排序。 自从 redis 4 版本