aardio 搭建Http服务器与Python客户端交互
By
jerryxjr1220
at 2022-02-16 • 1人收藏 • 2610人看过
aardio搭建Http服务器还是挺方便的,用aardio做前端,采用多线程启动服务器通过Http协议与python的后台程序实现交互,python在后端处理负责计算。aardio和python前后端或者终端都可以分离,只要能通过ip地址和端口号相互访问即可。
aardio服务器端:
import win.ui; /*DSG{{*/ mainForm = win.form(text="aardio2py";right=959;bottom=591) mainForm.add( edit={cls="edit";left=45;top=80;right=911;bottom=487;edge=1;multiline=1;z=1} ) /*}}*/ import thread; //启动多线程启动Http服务器监听"127.0.0.1:16543"端口 thread.invoke( function(winform){ import wsock.tcp.simpleHttpServer; server = wsock.tcp.simpleHttpServer("127.0.0.1", 16543); winform.edit.print('Server is running...\r\n'++server.getUrl()); //设置Http服务器中可以访问的全局变量 server.threadGlobal = { window = winform; }; //设置默认访问网页 server.defalutDocument = "index.html"; //启动服务器 server.run( function(response,request,session){ import string; window.edit.print( request.remoteAddr, request.path ); //非指定客户端拒绝访问 if request.headers["user-agent"] != "Py-App" { response.error("Access Deny! 503 Error!") } /*** //响应图标反馈, Python requests 访问用不到 elseif request.path == "/favicon.ico" { response.loadcode( "res/favicon.ico" ) } ***/ //业务逻辑响应 elseif request.path == "/" or request.path == "/index.html" { response.loadcode( "/index.html" ); } elseif string.startWith(request.path, "/senddata/") { subpath = string.match(request.path, "/senddata/(.*)") response.write(subpath) } }); }, mainForm) mainForm.show(); return win.loopMessage();
python客户端,直接用requests的Session实现会话。
from requests.sessions import Session ss = Session() ss.headers = {"User-Agent": "Py-App"} resp = ss.get("http://127.0.0.1:16543/senddata/12333") print(resp.text) print(ss.cookies)
客户端可以利用Cookies来存储必要身份信息
12 个回复 | 最后更新于 2022-02-18
2022-02-16
#4
其实主要就是为了实现界面UI和业务逻辑的分离,用aardio画界面太方便了,而且打个包很小,给到用户很方便。业务端要处理复杂任务,比如要跑神经网络,没有python的第三方库根本跑不了,打包的话巨大无比还不一定能打包成功。
2022-02-17
#8
回复#7 @jacen :
抽空研究了一下HTTP-JSON-RPC,它需要建立在HTTP服务器上,调用服务器接收到的request和response对象进行返回。
对原来的HTTP服务器做了修改:
//启动服务器 server.run( function(response,request,session){ import string; window.edit.print( request.postData()); import web.rpc.jsonServer; jserver = web.rpc.jsonServer(); jserver.hello = function(name){ /* 第一个返回值为客户端返回值(result), 第二个返回值为错误对象(error) */ if(!name) return null,-32602/*_JSONRPC_INVALID_PARAMS*/; return "hello " + name; } jserver.rpc.run(); });
同时,对Python客户端进行修改:
from requests.sessions import Session import json ss = Session() resp = ss.post("http://127.0.0.1:16543", data=json.dumps({"id":"hello","jsonrpc":"2.0","method":"hello","params":["jacen"]})) print(json.loads(resp.text)["result"])
python客户端输出:
hello jacen
唯一需要注意的是,客户端post出去的data是json格式的字符串,而不是python的字典对象。
这样的好处是,只要在jsonServer中自定义方法(函数),python客户端就可以远程操作服务器
2022-02-18
#10
回复#13 @jacen :
非常感谢!又学到一个非常有用的库!
服务器端:
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer server = SimpleJSONRPCServer(("localhost", 12306)) server.register_function(lambda z: z*z, "pow") server.serve_forever(poll_interval=0.5)
客户端:
import jsonrpclib server = jsonrpclib.Server("http://127.0.0.1:12306") print(server.pow(12306))
输出:
151437636
登录后方可回帖
同样的,用Python的Flask搭建服务器也非常方便,再用aardio的inet.http进行访问,可以实现双向交互。
Python Flask服务器端
服务器输出:
aardio客户端: