如何用Python实现一个最小的AJAX服务器?

2023-11-29

我想为 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用Python实现一个最小的AJAX服务器? 的相关文章

  • 如何测试该变量不等于多个事物?

    这是我的一段代码 choice while choice 1 and choice 2 and choice 3 choice raw input pick 1 2 or 3 if choice 1 print 1 it is elif c
  • 使用python编辑html,但是lxml将漂亮的html实体转换为奇怪的编码

    我正在尝试使用 python 带有 pyquery 和 lxml 来更改和清理一些 html Eg html div p It 146 s a spicy meatball p div lxml html clean 函数 clean ht
  • MVC 4 使用 Ajax.BeginForm() 从另一个局部视图更新局部视图

    我在其中一个页面上设置了评论部分 父视图有一个部分视图 它显示该 ID 的评论 并提供显示另一个部分视图以发布评论的选项 当有人发表评论时 我希望父级中的第一个部分视图刷新以显示新评论 目前 当您单击发表评论时 将调用 AddComment
  • MacOS Big Sur 中的 NPM 错误“找不到 Python 可执行文件”

    我已经花了整整一周的时间寻找这个问题的答案 但没有成功 我查看了每个 StackOverflow 帖子 Google 的每一篇文章以及我能找到的每个相关的 Github 问题 大多数相关错误似乎都比较旧 所以我想知道我的问题是否由于我使用的
  • 在 ubuntu 中卸载 python 模块

    我必须删除一个名为 django 的 python 模块 一种流行的模块 因为我安装了错误的版本 1 3 py 2 6 中的 beta 如何卸载这个模块 请解释一下 因为我只在 Windows 中使用过 python 而从未在 Ubuntu
  • 如何同时有效地运行多个 Pytorch 进程/模型? Traceback:分页文件太小,无法完成此操作

    背景 我有一个非常小的网络 我想用不同的随机种子进行测试 该网络几乎只使用了我的 GPU 计算能力的 1 因此理论上我可以同时运行 50 个进程来同时尝试许多不同的种子 Problem 不幸的是我什至无法在多个进程中导入 pytorch 当
  • 如何获取 Spotify API 的访问令牌?

    我已经研究 Spotify api 和示例源代码几天了 但我仍然不知道如何获取访问令牌来访问用户的播放列表数据 我已经到达了拉起登录窗口 用户登录 然后收到授权码的地步 此时 我尝试做这样的事情 window open https acco
  • Python:处理图像并保存到文件流

    我需要使用 python 处理图像 应用过滤器和其他转换 然后使用 HTTP 将其提供给用户 现在 我正在使用 BaseHTTPServer 和 PIL 问题是 PIL 无法直接写入文件流 因此我必须写入临时文件 然后读取该文件 以便将其发
  • Python 模块 BeautifulSoup 提取锚点 href

    我正在使用 BeautifulSoup 模块通过以下方式从 html 选择所有 href def extract links html soup BeautifulSoup html anchors soup findAll a print
  • 私有属性,但却是一个神秘的领域

    我想将属性设为私有 但带有 pydantic 字段 from pydantic import BaseModel Field PrivateAttr validator class A BaseModel a str I want a py
  • 在添加数据之前使用 Python gdata 清除工作表中的行

    我有一个 Google 电子表格 我使用 python 脚本和 gdata 库填充值 如果我多次运行脚本 它会将新行附加到工作表中 我希望脚本在填充之前首先清除行中的所有数据 这样每次运行时我都会有一组新的数据脚本 我尝试过使用 Updat
  • Pandas 根据条件替换数据框值

    我有一个主数据框 df Colour Item Price Blue Car 40 Red Car 30 Green Truck 50 Green Bike 30 然后我有一个价格修正数据框 df pc Colour Item Price
  • 哈希 freezeset 与排序元组

    在 Python 中 给定一组可比较的 可散列的元素s 散列是否更好frozenset s or tuple sorted s 这取决于你在做什么 创建一个更快frozenset 比排序tuple but frozenset占用的内存比tu
  • 数据类和属性装饰器

    我一直在阅读 Python 3 7 的数据类 作为命名元组的替代品 我通常在必须将数据分组到结构中时使用它 我想知道数据类是否与属性装饰器兼容 以便为数据类的数据元素定义 getter 和 setter 函数 如果是这样 是否在某处进行了描
  • 如何在 Jupyter Notebook 中选择 conda 环境

    我安装了 Anaconda 5 3 和 Python 3 7 根环境 之后我使用 Python 3 6 创建了一个新环境 py36 我激活了新环境activate py36 conda env list表明环境是活跃的 但是当我启动 Jup
  • 如何使用 QAbstractTableModel(模型/视图)将数据设置到 QComboBox?

    我希望能够设置itemData of a combobox当使用填充时QAbstractTableModel 但是 我只能从模型返回一个字符串data method 通常 当不使用模型时 可以像这样执行 Set text and data
  • 如何在Python中不使用库函数将字符串转换为整数?

    我正在尝试转换 a 546 to a 546 不使用任何库函数 我能想到的 最纯粹 gt gt gt a 546 gt gt gt result 0 gt gt gt for digit in a result 10 for d in 01
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • Docker Python 脚本找不到文件

    我已经成功构建了一个 Docker 容器 并将应用程序的文件复制到 Dockerfile 中的容器中 但是 我正在尝试执行引用输入文件 在 Docker 构建期间复制到容器中 的 Python 脚本 我似乎无法弄清楚为什么我的脚本告诉我它无
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究

随机推荐

  • 如何在 Python 中进行 DNS 查找,包括引用 /etc/hosts?

    dnspython会很好地完成我的 DNS 查找 但它完全忽略了 etc hosts 是否有一个 python 库调用可以做正确的事情 即先签入etc hosts 否则只能回退到 DNS 查找 我不太确定你是否想要进行 DNS 查找your
  • 如何更改 ggplot 中美学层的顺序?

    如何更改美学层的顺序 这是和例子 dat lt tibble acc rep c 0 1 200 rt rnorm 400 0 5 0 1 dat gt ggplot aes x rt fill factor acc geom densit
  • 使用媒体会话 Web API 的媒体通知不适用于 Web 音频 API

    我正在尝试在我的 PWA 中针对当前播放的音频内容实现自定义通知 正如标题所述 我使用 Android v8 1 0 和 Google Chrome 应用程序 v68 0 x 根据this文章 The Media Session API i
  • 在 Identity 2.0 中扩展 IdentityUserRole

    因此 我的系统要求角色具有关联的到期日期 我已经实现了 Identity 2 0 框架 一切进展顺利 但我遇到了一个问题 让我怀疑我的结构 public class ApplicationUserRole IdentityUserRole
  • 如何防止ListView扩大窗口尺寸?

    我将 ListView 放在 View 的中间行 该视图包含在 SizeToContent 设置为 WidthAndHeight 的窗口中 ListView 最初是空的 但底层 ViewModel 在此过程中填充了此列表视图 中间的 Gri
  • 使用 Julia 和 gurobi 进行二次约束 MIQP

    这是试图回答以下问题 https matheducators stackexchange com questions 11757 small data sets with integral sample standard deviation
  • 函数参数传递和返回

    var foo bar function return this baz baz 1 function return typeof arguments 0 foo bar 为什么这段代码会返回undefined 我会假设arguments
  • 如何将 MOVE 用于以记录为元素且其上有动态数组字段的动态数组?

    我正在使用 Delphi Rio 我的程序有很多动态数组操作 为了提高一些长数组复制的速度 我尝试使用 Move 对于基本类型 实数 整数 的一维动态数组 我可以管理 Move 的使用 但对于以记录作为其元素的动态数组 并且该记录具有另一个
  • Python根据条件分割字符串

    如果逗号前面有某个正则表达式 我想使用逗号分隔符分割字符串 考虑我的字符串格式如下的情况 一堆可能有逗号的东西 FOO REGEX 其他可能有逗号的东西 FOO REGEX 我想用逗号分割字符串 但前提是它们前面有 FOO REGEX 一堆
  • 使用 ContentFlow (coverflow) 显示数据库图像 IllegalStateException 错误

    我目前正在使用第三方图像 coverflow http www jacksasylum eu ContentFlow 来显示保存在数据库中的图像 为此 我使用 Java JPA 和 Richfaces 我已经设置了一个图像 servlet
  • 添加 Excel 格式的最有效方法 - VBA

    我有一个宏 可以将数百行数据添加到 Excel 电子表格中 我从插入每行数据的循环中调用一个过程 每次插入该数据时 我都会应用该行的格式 然而 在测试过程中 我发现当我不逐行应用格式而是一次全部应用格式时 插入所有数据的速度可以快大约 3
  • 在Python OpenCV中访问IP摄像头

    如何访问我的网络摄像机流 显示标准网络摄像头流的代码是 import cv2 import numpy as np cap cv2 VideoCapture 0 while True ret frame cap read cv2 imsho
  • 当具体类包含其他接口时如何反序列化接口集合

    我目前面临的情况是 我得到了一个无法修改的 json 文件 并且我希望生成的反序列化类对于设计目的是通用的 首先是我的界面 public interface IJobModel string ClientBaseURL get set st
  • Git 合并混乱。 diff 显示差异,merge 表示没有差异

    我开始学习使用git 我遇到了一个我不明白的情况 存储库被从svn中取出 我在树枝上jacob 379尽一切努力 host git status On branch jacob 379 nothing to commit working d
  • 如何将“expo-splash-screen”与“expo-google-fonts”一起使用?

    初始屏幕使用异步操作等待 而字体包使用 自定义挂钩 useFonts 我猜 如何让启动屏幕等待谷歌字体加载 您可以使用以下方式加载字体loadAsync from expo fonts 并管理启动画面expo splash screen i
  • Drupal 7 术语路径在哪里?

    使用 Drupal 6 中的 pathauto 和 token 模块 您可以使用如下模式创建 url 别名 termpath raw title raw 然而 Drupal 7 中的情况并非如此 我知道 D7 仍处于 alpha 阶段 但
  • Junit @Rule 如何工作?

    我想为大量代码编写测试用例 我想了解JUnit的详细信息 Rule注释功能 以便我可以使用它来编写测试用例 请提供一些好的答案或链接 通过一个简单的示例详细描述其功能 规则用于添加适用于测试类中的所有测试的附加功能 但以更通用的方式 例如
  • 无法解析 XML blob

    我在对 azure 上的 dbs 进行身份验证时遇到问题 所有详细信息都是正确的 但是当我单击 连接 时 出现以下错误 TITLE Microsoft SQL Server Management Studio Error connectin
  • 单行检查列表中至少一项是否存在于另一个列表中? [复制]

    这个问题在这里已经有答案了 假设我有一个清单a 1 2 3 我想知道其中至少有一个数字是否存在于另一个列表中 如下所示 b 4 5 6 7 8 1 换句话说 我想知道列表中是否存在 1 2 或 3b 我现在可以做类似的事情 def func
  • 如何用Python实现一个最小的AJAX服务器?

    我想为 Python 程序创建一个非常简单的基于 HTML AJAX 的 GUI 所以前端是一个 HTML 页面 通过 AJAX 与程序进行通信 你能给我一个使用 python 的服务器端的最小实现吗SimpleHTTPServer Sim