如何使用javascript客户端设置Python服务器端
因此,已经有一个Python程序在控制台上运行,我必须在此基础上进行构建。我将使用Javascript为应用程序构建一个web GUI界面。 我将如何: a。继续处理这个Python程序的输入/输出,而不涉及原始代码 b。通过Javascript调用向Python程序发送控制台行输入。我已经研究了原始HTTP请求/AJAX,但我不确定如何将其作为输入发送到Python程序如何使用javascript客户端设置Python服务器端,javascript,python,Javascript,Python,因此,已经有一个Python程序在控制台上运行,我必须在此基础上进行构建。我将使用Javascript为应用程序构建一个web GUI界面。 我将如何: a。继续处理这个Python程序的输入/输出,而不涉及原始代码 b。通过Javascript调用向Python程序发送控制台行输入。我已经研究了原始HTTP请求/AJAX,但我不确定如何将其作为输入发送到Python程序 是另一个选项,但对于您的需要来说可能太高了。这取决于您包装的应用程序类型以及GUI选项如何转换为应用程序命令。但你有两个目标
是另一个选项,但对于您的需要来说可能太高了。这取决于您包装的应用程序类型以及GUI选项如何转换为应用程序命令。但你有两个目标:
a。要处理程序的输入/输出:。它相当容易使用,阅读随它一起分发的一些示例应该可以教会您足够多的知识,让您掌握基本知识 b。Javascript接口: 我使用gevent,它是内置的WSGI服务器。(查找a()是什么)。我应该注意,这个程序将保持一个状态,因此您可以通过向javascript客户机返回会话ID并将您的pexpect会话存储在一个全局变量或其他容器中来管理打开的会话,这样您就可以跨多个独立的AJAX请求完成程序的输入和输出。然而,我把这件事留给你,因为这并不是那么简单 我的示例所要做的就是在单击您选择的内容后将POST请求放入其中。(它实际上不起作用,因为有些变量没有设置。请设置它们。) 以下是相关部分:
<!-- JavaScript -->
<script src="jquery.js"></script>
<script type="text/javascript">
function toPython(usrdata){
$.ajax({
url: "http://yoursite.com:8080",
type: "POST",
data: { information : "You have a very nice website, sir." , userdata : usrdata },
dataType: "json",
success: function(data) {
<!-- do something here -->
$('#somediv').html(data);
}});
$("#someButton").bind('click', toPython(something));
</script>
如果您的程序是面向对象的,那么集成它就相当容易了。编辑:不需要是面向对象的。我现在已经包含了一些Pexpect代码
global d
d = someClass()
def application(environ, start_response):
# get the instruction
password = somethingfromwsgi # read the tutorials on WSGI to get the post stuff
# figure out WHAT to do
global d
success = d.doSomething()
# or success = funccall()
prog = pexpect.spawn('python someprogram.py')
prog.expect("Password: ")
prog.sendline(password)
i = prog.expect(["OK","not OK", "error"])
if i==0:
start_response("200 OK", [("Content-Type", "text/html; charset=utf-8")])
return "Success"
elif i==1:
start_response("500 Internal Server Error", [("Content-Type", "text/html; charset=utf-8")])
return "Failure"
elif i==2:
start_response("500 Internal Server Error", [("Content-Type", "text/html; charset=utf-8")])
return "Error"
我建议的另一个选择是Nginx+uWSGI。如果你愿意,我也可以给你举一些例子。它使您能够将Web服务器合并到设置中。要将数据从javascript透明地传递到外部Python程序,您可以使用WebSocket协议连接服务器和javascript,并使用stdin/stdout从服务器与外部程序通信 下面是一个示例Python程序
client.py
:
#/usr/bin/env python
“”“将标准输入转换为大写。”“”
对于iter中的线路(原始输入,“退出”):
打印行。上()
我已使用中的代码创建了一个服务器,请回答以下问题:
#/usr/bin/python
“”“WebSocket CLI接口。”“”
导入系统
从twisted.application导入strport#pip安装twisted
从twisted.application导入服务
从twisted.internet导入协议
从twisted.python导入日志
从twisted.web.server导入站点
从twisted.web.static导入文件
从txws导入WebSocketFactory#pip安装txws
类协议(Protocol.Protocol):
def connectionMade(自):
从twisted.internet导入
msg(“在每个新连接上启动一个新进程”)
self.pp=ProcessProtocol()
self.pp.factory=self
reactor.spawnProcess(self.pp、sys.executable、,
[sys.executable'-u',client.py']
接收到def数据(自身、数据):
log.msg(“将收到的数据重定向到进程的stdin:%r”%data)
self.pp.transport.write(数据)
def connectionLost(自身、原因):
self.pp.transport.loseConnection()
def_发送(自身、数据):
self.transport.write(数据)#发回
类ProcessProtocol(protocol.ProcessProtocol):
def connectionMade(自):
log.msg(“connectionMade”)
def输出(自身、数据):
log.msg(“将标准输出发送回%r”%data)
自发送(数据)
接收到的def错误(自身、数据):
log.msg(“将stderr发回%r”%data)
自发送(数据)
def进程已退出(自身、原因):
log.msg(“processExited”)
def PROCESSEND(自我、原因):
log.msg(“processEnded”)
def_发回(自身、数据):
自我工厂发送(数据)
application=service.application(“ws-cli”)
_echofactory=protocol.Factory()
_echofactory.protocol=协议
strport.service(“tcp:8076:interface=127.0.0.1”,
WebSocketFactory(_echofactory)).setServiceParent(应用程序)
resource=File('.')#服务当前目录,包括*.py文件
strport.service(“tcp:8080:interface=127.0.0.1”,
站点(资源)).setServiceParent(应用程序)
web客户端部分,sendkeys.html
:
<!doctype html>
<title>Send keys using websocket and echo the response</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
</script>
<script src="sendkeys.js"></script>
<input type=text id=entry value="type something">
<div id=output>Here you should see the typed text in UPPER case</div>
要尝试它:
- 安装twisted,
:txws
$ pip install twisted txws
- 运行:
$ twistd -ny wscli.py
- 访问
http://localhost:8080/
$ pip install twisted txws
$ twistd -ny wscli.py