Name | ksrpc JSON |
Version |
0.3.5
JSON |
| download |
home_page | None |
Summary | Keep Simple RPC |
upload_time | 2024-05-01 09:32:08 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.6 |
license | MIT License Copyright (c) 2022 wukan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
keywords |
polars
expression
talib
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# ksrpc
Keep Simple RPC。免注册远程过程调用
## 项目背景
团队里常常需要通过平台下载各数据,但只有一套账号。通常的方案如下:
1. 一个账号大家共用。最简单粗暴
1. 账号还能登录平台的其它功能,不便于分享
2. 账号可能有在线数上限,会导致互踢
3. 不同成员可能重复下载相同数据,同一成员也可能反复下载相同数据
2. 由IT团队将数据提前下载过来。人力成本最高
1. IT团队需要提前规划部署,并向研究团队推广
2. 不同数据需要IT团队针对性的提前准备下载,时效性一般
3. 有些数据只是临时少量需要,需求变化快
如果搭建一套服务,客户端不需账号,基本不用改动代码,是否解决多成员分享问题?所以这个项目就是为了API转发,只是后来发现本质上是RPC
## 目标及特性
1. 不修改第三方API源代码,实现客户端免登录
2. 新接口与原接口一致,基本不用改动代码
3. 数据缓存功能,减少下载次数。针对有数据有限额、调用次数有限制等情况
4. 跨语言,能将大量Python的数据API转成HTTP服务,由其它语言调用
5. 既支持同步调用,又支持异步调用
## 应用场景
1. 数据缓存转发
2. 源代码保护。核心代码不提供,只向外暴露服务
3. 远程控制。可调os、sys等库
## 与其它RPC的区别
1. 免注册就可以向外自动暴露所有API
1. 不得不添加函数白名单与黑名单功能
2. 添加了简易版的token认证功能
2. 所有API都自动暴露,但并不是所有API都能正常使用。例如:
1. 输入与输出无法序列化和反序列化
2. 部分API使用方法特殊,也可能无法使用
3. 数据量太大,序列化、网络传输都不太现实
3. 可先选择不同的通讯方式,目前提供的方式有:HTTP、WebSocket
4. 出于数据版权保护,默认添加了IP地址校验开关,限制只在内网使用
5. 多人使用时,少数人超量使用,所以又添加了数据量限额功能
## 服务端安装
1. 安装`ksrpc`库
> pip install ksrpc[server] -i https://mirrors.aliyun.com/pypi/simple --upgrade
2. 直接运行`python -m ksrpc`, 观察提示的`config.py`文件路径
2. 编辑`config.py`文件,进行`ksrpy`的功能管理。如权限配置等`ENABLE_SERVER = True`
4. 再次运行`python -m ksrpc`或对应目录下运行`python run_app.py`
5. 确保服务器上防火墙已经开放对应端口
## 客户端安装
1. 安装`ksrpc`库
> pip install ksrpc[client] -i https://mirrors.aliyun.com/pypi/simple --upgrade
2. 编辑`examples`目录下的`demo_http.py`和`demo_websocket.py`中对应的服务地址
3. 运行`demo_http.py`和`demo_websocket.py`,检查是否运行正常
## 示例
1. 直接可替代的。如`tests`目录下的:os、numpy、pandas、akshare等
1. 客户端没有安装相应包的情况下,IDE无法自动补全
2. 需要服务端进行登录等一类处理的。如`server`目录下的,jqdatasdk、tushare、WindPy等
3. 客户端参数无法序列化,需要特殊处理的。如`hack`目录下的jqdatasdk、WindPy等
1. 需要客户端安装第三方库,IDE的自动补全功能正常
```python
from ksrpc import RpcClient
from ksrpc.connections.http import HttpxConnection
conn = HttpxConnection('http://127.0.0.1:8000/api/file')
conn.timeout = None
math = RpcClient('math', conn, async_local=False)
math.cache_get = True
math.cache_expire = 86400
# 模块中变量获取方法。加了括号
print(math.pi())
print(math.pow(2, 3))
```
```python
# 创建客户连接
from ksrpc import RpcClient
from ksrpc.connections.http import HttpxConnection
conn = HttpxConnection('http://127.0.0.1:8000/api/file')
conn.timeout = None
client = RpcClient('tushare', conn, async_local=False)
client.cache_get = True
client.cache_expire = 86400
# 对原版库进行定制处理,需要已经安装了原版库
from ksrpc.hack.tushare import hack
hack(client)
# 原版代码可都保持不变
import tushare as ts
ts.set_token('TUSHARE_TOKEN')
pro = ts.pro_api()
df = pro.trade_cal(exchange='', start_date='20210901', end_date='20211231')
print(df)
df = pro.daily(ts_code='000001.SZ,600000.SH', start_date='20180701', end_date='20180718')
print(df)
```
## 部分支持转发的库
1. [AkShare](tests/akshare_.py)(已测)
2. TuShare [方法一](examples/tushare_hack.py) [方法二](examples/tushare_client.py)(已测)
3. [rqdatac](examples/rqdatac_hack.py)(已测)
4. [jqdatasdk](examples/jqdatasdk_hack.py)(缺账号,未测)
5. [Wind](examples/wind_hack.py)(缺账号,未测)
6. 其它...
## 跨语言开发文档
跨语言示例代码在`lang`目录下
[跨语言开发文档](lang/)
## 声明
此库仅供学习交流,请在数据提供方的授权范围内使用。请勿向第三方转发数据
## 反弹RPC(反向RPC)/中继服务
如果提供服务的机器在内网,无法搭建服务,也无法直接访问怎么办?参考Reverse Shell的概念,本项目提供了Reverse RPC功能
1. 公网服务器上安装`pip install ksrpc[server]`,修改配置,运行`python run_app.py`,记下公网IP
2. 内网服务器上安装`pip install ksrpc`(如果网络受限,可下载whl文件本地安装),修改`rpc_reverse.py`中为公网IP,运行`python rpc_reverse.py`。此代码可粘贴到Notebook中运行
3. 观察内网脚本是否能连接公网服务器
4. 个人电脑上安装`pip install ksrpc[client]`,编辑`examples/demo_reverse.py`中为公网IP,运行,观察结果
5. 注意地址不同,内网被控端连接公网IP下的`/client`, 个人电脑连接公网IP下的`/admin`,并且要用完全一样的房间号
6. 默认情况下,`config.py`中的`ENABLE_RELAY = True`已经开启
## 参考项目
开发到一定阶段后才发现与`rpyc`这个免注册暴露函数的功能类似,大家也可以去学习一下
https://github.com/tomerfiliba-org/rpyc
Raw data
{
"_id": null,
"home_page": null,
"name": "ksrpc",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "polars, expression, talib",
"author": null,
"author_email": "wukan <wu-kan@163.com>",
"download_url": "https://files.pythonhosted.org/packages/90/c9/8699e9a9bfd7de7b4ec4160b92339f75d5ecedb5b75606a4f80872a07818/ksrpc-0.3.5.tar.gz",
"platform": null,
"description": "# ksrpc\nKeep Simple RPC\u3002\u514d\u6ce8\u518c\u8fdc\u7a0b\u8fc7\u7a0b\u8c03\u7528\n\n## \u9879\u76ee\u80cc\u666f\n\u56e2\u961f\u91cc\u5e38\u5e38\u9700\u8981\u901a\u8fc7\u5e73\u53f0\u4e0b\u8f7d\u5404\u6570\u636e\uff0c\u4f46\u53ea\u6709\u4e00\u5957\u8d26\u53f7\u3002\u901a\u5e38\u7684\u65b9\u6848\u5982\u4e0b\uff1a\n1. \u4e00\u4e2a\u8d26\u53f7\u5927\u5bb6\u5171\u7528\u3002\u6700\u7b80\u5355\u7c97\u66b4\n 1. \u8d26\u53f7\u8fd8\u80fd\u767b\u5f55\u5e73\u53f0\u7684\u5176\u5b83\u529f\u80fd\uff0c\u4e0d\u4fbf\u4e8e\u5206\u4eab\n 2. \u8d26\u53f7\u53ef\u80fd\u6709\u5728\u7ebf\u6570\u4e0a\u9650\uff0c\u4f1a\u5bfc\u81f4\u4e92\u8e22\n 3. \u4e0d\u540c\u6210\u5458\u53ef\u80fd\u91cd\u590d\u4e0b\u8f7d\u76f8\u540c\u6570\u636e\uff0c\u540c\u4e00\u6210\u5458\u4e5f\u53ef\u80fd\u53cd\u590d\u4e0b\u8f7d\u76f8\u540c\u6570\u636e\n2. \u7531IT\u56e2\u961f\u5c06\u6570\u636e\u63d0\u524d\u4e0b\u8f7d\u8fc7\u6765\u3002\u4eba\u529b\u6210\u672c\u6700\u9ad8\n 1. IT\u56e2\u961f\u9700\u8981\u63d0\u524d\u89c4\u5212\u90e8\u7f72\uff0c\u5e76\u5411\u7814\u7a76\u56e2\u961f\u63a8\u5e7f\n 2. \u4e0d\u540c\u6570\u636e\u9700\u8981IT\u56e2\u961f\u9488\u5bf9\u6027\u7684\u63d0\u524d\u51c6\u5907\u4e0b\u8f7d\uff0c\u65f6\u6548\u6027\u4e00\u822c\n 3. \u6709\u4e9b\u6570\u636e\u53ea\u662f\u4e34\u65f6\u5c11\u91cf\u9700\u8981\uff0c\u9700\u6c42\u53d8\u5316\u5feb\n\n\u5982\u679c\u642d\u5efa\u4e00\u5957\u670d\u52a1\uff0c\u5ba2\u6237\u7aef\u4e0d\u9700\u8d26\u53f7\uff0c\u57fa\u672c\u4e0d\u7528\u6539\u52a8\u4ee3\u7801\uff0c\u662f\u5426\u89e3\u51b3\u591a\u6210\u5458\u5206\u4eab\u95ee\u9898\uff1f\u6240\u4ee5\u8fd9\u4e2a\u9879\u76ee\u5c31\u662f\u4e3a\u4e86API\u8f6c\u53d1\uff0c\u53ea\u662f\u540e\u6765\u53d1\u73b0\u672c\u8d28\u4e0a\u662fRPC\n\n## \u76ee\u6807\u53ca\u7279\u6027\n1. \u4e0d\u4fee\u6539\u7b2c\u4e09\u65b9API\u6e90\u4ee3\u7801\uff0c\u5b9e\u73b0\u5ba2\u6237\u7aef\u514d\u767b\u5f55\n2. \u65b0\u63a5\u53e3\u4e0e\u539f\u63a5\u53e3\u4e00\u81f4\uff0c\u57fa\u672c\u4e0d\u7528\u6539\u52a8\u4ee3\u7801\n3. \u6570\u636e\u7f13\u5b58\u529f\u80fd\uff0c\u51cf\u5c11\u4e0b\u8f7d\u6b21\u6570\u3002\u9488\u5bf9\u6709\u6570\u636e\u6709\u9650\u989d\u3001\u8c03\u7528\u6b21\u6570\u6709\u9650\u5236\u7b49\u60c5\u51b5\n4. \u8de8\u8bed\u8a00\uff0c\u80fd\u5c06\u5927\u91cfPython\u7684\u6570\u636eAPI\u8f6c\u6210HTTP\u670d\u52a1\uff0c\u7531\u5176\u5b83\u8bed\u8a00\u8c03\u7528\n5. \u65e2\u652f\u6301\u540c\u6b65\u8c03\u7528\uff0c\u53c8\u652f\u6301\u5f02\u6b65\u8c03\u7528\n\n## \u5e94\u7528\u573a\u666f\n1. \u6570\u636e\u7f13\u5b58\u8f6c\u53d1\n2. \u6e90\u4ee3\u7801\u4fdd\u62a4\u3002\u6838\u5fc3\u4ee3\u7801\u4e0d\u63d0\u4f9b\uff0c\u53ea\u5411\u5916\u66b4\u9732\u670d\u52a1\n3. \u8fdc\u7a0b\u63a7\u5236\u3002\u53ef\u8c03os\u3001sys\u7b49\u5e93\n\n## \u4e0e\u5176\u5b83RPC\u7684\u533a\u522b\n1. \u514d\u6ce8\u518c\u5c31\u53ef\u4ee5\u5411\u5916\u81ea\u52a8\u66b4\u9732\u6240\u6709API\n 1. \u4e0d\u5f97\u4e0d\u6dfb\u52a0\u51fd\u6570\u767d\u540d\u5355\u4e0e\u9ed1\u540d\u5355\u529f\u80fd\n 2. \u6dfb\u52a0\u4e86\u7b80\u6613\u7248\u7684token\u8ba4\u8bc1\u529f\u80fd\n2. \u6240\u6709API\u90fd\u81ea\u52a8\u66b4\u9732\uff0c\u4f46\u5e76\u4e0d\u662f\u6240\u6709API\u90fd\u80fd\u6b63\u5e38\u4f7f\u7528\u3002\u4f8b\u5982\uff1a\n 1. \u8f93\u5165\u4e0e\u8f93\u51fa\u65e0\u6cd5\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\n 2. \u90e8\u5206API\u4f7f\u7528\u65b9\u6cd5\u7279\u6b8a\uff0c\u4e5f\u53ef\u80fd\u65e0\u6cd5\u4f7f\u7528\n 3. \u6570\u636e\u91cf\u592a\u5927\uff0c\u5e8f\u5217\u5316\u3001\u7f51\u7edc\u4f20\u8f93\u90fd\u4e0d\u592a\u73b0\u5b9e\n3. \u53ef\u5148\u9009\u62e9\u4e0d\u540c\u7684\u901a\u8baf\u65b9\u5f0f\uff0c\u76ee\u524d\u63d0\u4f9b\u7684\u65b9\u5f0f\u6709\uff1aHTTP\u3001WebSocket\n4. \u51fa\u4e8e\u6570\u636e\u7248\u6743\u4fdd\u62a4\uff0c\u9ed8\u8ba4\u6dfb\u52a0\u4e86IP\u5730\u5740\u6821\u9a8c\u5f00\u5173\uff0c\u9650\u5236\u53ea\u5728\u5185\u7f51\u4f7f\u7528\n5. \u591a\u4eba\u4f7f\u7528\u65f6\uff0c\u5c11\u6570\u4eba\u8d85\u91cf\u4f7f\u7528\uff0c\u6240\u4ee5\u53c8\u6dfb\u52a0\u4e86\u6570\u636e\u91cf\u9650\u989d\u529f\u80fd\n\n## \u670d\u52a1\u7aef\u5b89\u88c5\n1. \u5b89\u88c5`ksrpc`\u5e93\n> pip install ksrpc[server] -i https://mirrors.aliyun.com/pypi/simple --upgrade\n2. \u76f4\u63a5\u8fd0\u884c`python -m ksrpc`, \u89c2\u5bdf\u63d0\u793a\u7684`config.py`\u6587\u4ef6\u8def\u5f84\n2. \u7f16\u8f91`config.py`\u6587\u4ef6\uff0c\u8fdb\u884c`ksrpy`\u7684\u529f\u80fd\u7ba1\u7406\u3002\u5982\u6743\u9650\u914d\u7f6e\u7b49`ENABLE_SERVER = True`\n4. \u518d\u6b21\u8fd0\u884c`python -m ksrpc`\u6216\u5bf9\u5e94\u76ee\u5f55\u4e0b\u8fd0\u884c`python run_app.py`\n5. \u786e\u4fdd\u670d\u52a1\u5668\u4e0a\u9632\u706b\u5899\u5df2\u7ecf\u5f00\u653e\u5bf9\u5e94\u7aef\u53e3\n\n## \u5ba2\u6237\u7aef\u5b89\u88c5\n1. \u5b89\u88c5`ksrpc`\u5e93\n> pip install ksrpc[client] -i https://mirrors.aliyun.com/pypi/simple --upgrade\n2. \u7f16\u8f91`examples`\u76ee\u5f55\u4e0b\u7684`demo_http.py`\u548c`demo_websocket.py`\u4e2d\u5bf9\u5e94\u7684\u670d\u52a1\u5730\u5740\n3. \u8fd0\u884c`demo_http.py`\u548c`demo_websocket.py`\uff0c\u68c0\u67e5\u662f\u5426\u8fd0\u884c\u6b63\u5e38\n\n## \u793a\u4f8b\n1. \u76f4\u63a5\u53ef\u66ff\u4ee3\u7684\u3002\u5982`tests`\u76ee\u5f55\u4e0b\u7684\uff1aos\u3001numpy\u3001pandas\u3001akshare\u7b49\n 1. \u5ba2\u6237\u7aef\u6ca1\u6709\u5b89\u88c5\u76f8\u5e94\u5305\u7684\u60c5\u51b5\u4e0b\uff0cIDE\u65e0\u6cd5\u81ea\u52a8\u8865\u5168\n2. \u9700\u8981\u670d\u52a1\u7aef\u8fdb\u884c\u767b\u5f55\u7b49\u4e00\u7c7b\u5904\u7406\u7684\u3002\u5982`server`\u76ee\u5f55\u4e0b\u7684\uff0cjqdatasdk\u3001tushare\u3001WindPy\u7b49\n3. \u5ba2\u6237\u7aef\u53c2\u6570\u65e0\u6cd5\u5e8f\u5217\u5316\uff0c\u9700\u8981\u7279\u6b8a\u5904\u7406\u7684\u3002\u5982`hack`\u76ee\u5f55\u4e0b\u7684jqdatasdk\u3001WindPy\u7b49\n 1. \u9700\u8981\u5ba2\u6237\u7aef\u5b89\u88c5\u7b2c\u4e09\u65b9\u5e93\uff0cIDE\u7684\u81ea\u52a8\u8865\u5168\u529f\u80fd\u6b63\u5e38\n\n```python\nfrom ksrpc import RpcClient\nfrom ksrpc.connections.http import HttpxConnection\n\nconn = HttpxConnection('http://127.0.0.1:8000/api/file')\nconn.timeout = None\nmath = RpcClient('math', conn, async_local=False)\nmath.cache_get = True\nmath.cache_expire = 86400\n\n# \u6a21\u5757\u4e2d\u53d8\u91cf\u83b7\u53d6\u65b9\u6cd5\u3002\u52a0\u4e86\u62ec\u53f7\nprint(math.pi())\nprint(math.pow(2, 3))\n```\n\n```python\n# \u521b\u5efa\u5ba2\u6237\u8fde\u63a5\nfrom ksrpc import RpcClient\nfrom ksrpc.connections.http import HttpxConnection\n\nconn = HttpxConnection('http://127.0.0.1:8000/api/file')\nconn.timeout = None\nclient = RpcClient('tushare', conn, async_local=False)\nclient.cache_get = True\nclient.cache_expire = 86400\n\n# \u5bf9\u539f\u7248\u5e93\u8fdb\u884c\u5b9a\u5236\u5904\u7406\uff0c\u9700\u8981\u5df2\u7ecf\u5b89\u88c5\u4e86\u539f\u7248\u5e93\nfrom ksrpc.hack.tushare import hack\n\nhack(client)\n\n# \u539f\u7248\u4ee3\u7801\u53ef\u90fd\u4fdd\u6301\u4e0d\u53d8\nimport tushare as ts\n\nts.set_token('TUSHARE_TOKEN')\npro = ts.pro_api()\ndf = pro.trade_cal(exchange='', start_date='20210901', end_date='20211231')\nprint(df)\ndf = pro.daily(ts_code='000001.SZ,600000.SH', start_date='20180701', end_date='20180718')\nprint(df)\n```\n\n## \u90e8\u5206\u652f\u6301\u8f6c\u53d1\u7684\u5e93\n1. [AkShare](tests/akshare_.py)(\u5df2\u6d4b)\n2. TuShare [\u65b9\u6cd5\u4e00](examples/tushare_hack.py) [\u65b9\u6cd5\u4e8c](examples/tushare_client.py)(\u5df2\u6d4b)\n3. [rqdatac](examples/rqdatac_hack.py)(\u5df2\u6d4b)\n4. [jqdatasdk](examples/jqdatasdk_hack.py)(\u7f3a\u8d26\u53f7\uff0c\u672a\u6d4b)\n5. [Wind](examples/wind_hack.py)(\u7f3a\u8d26\u53f7\uff0c\u672a\u6d4b)\n6. \u5176\u5b83...\n\n## \u8de8\u8bed\u8a00\u5f00\u53d1\u6587\u6863\n\u8de8\u8bed\u8a00\u793a\u4f8b\u4ee3\u7801\u5728`lang`\u76ee\u5f55\u4e0b\n[\u8de8\u8bed\u8a00\u5f00\u53d1\u6587\u6863](lang/)\n\n## \u58f0\u660e\n\u6b64\u5e93\u4ec5\u4f9b\u5b66\u4e60\u4ea4\u6d41\uff0c\u8bf7\u5728\u6570\u636e\u63d0\u4f9b\u65b9\u7684\u6388\u6743\u8303\u56f4\u5185\u4f7f\u7528\u3002\u8bf7\u52ff\u5411\u7b2c\u4e09\u65b9\u8f6c\u53d1\u6570\u636e\n\n## \u53cd\u5f39RPC(\u53cd\u5411RPC)/\u4e2d\u7ee7\u670d\u52a1\n\u5982\u679c\u63d0\u4f9b\u670d\u52a1\u7684\u673a\u5668\u5728\u5185\u7f51\uff0c\u65e0\u6cd5\u642d\u5efa\u670d\u52a1\uff0c\u4e5f\u65e0\u6cd5\u76f4\u63a5\u8bbf\u95ee\u600e\u4e48\u529e\uff1f\u53c2\u8003Reverse Shell\u7684\u6982\u5ff5\uff0c\u672c\u9879\u76ee\u63d0\u4f9b\u4e86Reverse RPC\u529f\u80fd\n1. \u516c\u7f51\u670d\u52a1\u5668\u4e0a\u5b89\u88c5`pip install ksrpc[server]`\uff0c\u4fee\u6539\u914d\u7f6e\uff0c\u8fd0\u884c`python run_app.py`\uff0c\u8bb0\u4e0b\u516c\u7f51IP\n2. \u5185\u7f51\u670d\u52a1\u5668\u4e0a\u5b89\u88c5`pip install ksrpc`(\u5982\u679c\u7f51\u7edc\u53d7\u9650\uff0c\u53ef\u4e0b\u8f7dwhl\u6587\u4ef6\u672c\u5730\u5b89\u88c5)\uff0c\u4fee\u6539`rpc_reverse.py`\u4e2d\u4e3a\u516c\u7f51IP\uff0c\u8fd0\u884c`python rpc_reverse.py`\u3002\u6b64\u4ee3\u7801\u53ef\u7c98\u8d34\u5230Notebook\u4e2d\u8fd0\u884c\n3. \u89c2\u5bdf\u5185\u7f51\u811a\u672c\u662f\u5426\u80fd\u8fde\u63a5\u516c\u7f51\u670d\u52a1\u5668\n4. \u4e2a\u4eba\u7535\u8111\u4e0a\u5b89\u88c5`pip install ksrpc[client]`\uff0c\u7f16\u8f91`examples/demo_reverse.py`\u4e2d\u4e3a\u516c\u7f51IP\uff0c\u8fd0\u884c\uff0c\u89c2\u5bdf\u7ed3\u679c\n5. \u6ce8\u610f\u5730\u5740\u4e0d\u540c\uff0c\u5185\u7f51\u88ab\u63a7\u7aef\u8fde\u63a5\u516c\u7f51IP\u4e0b\u7684`/client`, \u4e2a\u4eba\u7535\u8111\u8fde\u63a5\u516c\u7f51IP\u4e0b\u7684`/admin`\uff0c\u5e76\u4e14\u8981\u7528\u5b8c\u5168\u4e00\u6837\u7684\u623f\u95f4\u53f7\n6. \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c`config.py`\u4e2d\u7684`ENABLE_RELAY = True`\u5df2\u7ecf\u5f00\u542f\n\n## \u53c2\u8003\u9879\u76ee\n\u5f00\u53d1\u5230\u4e00\u5b9a\u9636\u6bb5\u540e\u624d\u53d1\u73b0\u4e0e`rpyc`\u8fd9\u4e2a\u514d\u6ce8\u518c\u66b4\u9732\u51fd\u6570\u7684\u529f\u80fd\u7c7b\u4f3c\uff0c\u5927\u5bb6\u4e5f\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e00\u4e0b\nhttps://github.com/tomerfiliba-org/rpyc\n\n",
"bugtrack_url": null,
"license": "MIT License Copyright (c) 2022 wukan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
"summary": "Keep Simple RPC",
"version": "0.3.5",
"project_urls": null,
"split_keywords": [
"polars",
" expression",
" talib"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "da68dd36be5266f1c2bc6be8e9aaddbad6da341b8d3abe8cafd7e0e8a1fd3962",
"md5": "1b427bf5dc885a37247c607b6f6ed9b8",
"sha256": "106da74759ad0af207b9e87d35c33877a965a0b357d384d323ec385f32b10273"
},
"downloads": -1,
"filename": "ksrpc-0.3.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1b427bf5dc885a37247c607b6f6ed9b8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 37303,
"upload_time": "2024-05-01T09:32:06",
"upload_time_iso_8601": "2024-05-01T09:32:06.214776Z",
"url": "https://files.pythonhosted.org/packages/da/68/dd36be5266f1c2bc6be8e9aaddbad6da341b8d3abe8cafd7e0e8a1fd3962/ksrpc-0.3.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "90c98699e9a9bfd7de7b4ec4160b92339f75d5ecedb5b75606a4f80872a07818",
"md5": "b77fe0ab80af810296260da669128b9a",
"sha256": "33bce6d87b1fe1b84da1c25b42e2201edae293824d897e13c3936f03e1257717"
},
"downloads": -1,
"filename": "ksrpc-0.3.5.tar.gz",
"has_sig": false,
"md5_digest": "b77fe0ab80af810296260da669128b9a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 28394,
"upload_time": "2024-05-01T09:32:08",
"upload_time_iso_8601": "2024-05-01T09:32:08.070218Z",
"url": "https://files.pythonhosted.org/packages/90/c9/8699e9a9bfd7de7b4ec4160b92339f75d5ecedb5b75606a4f80872a07818/ksrpc-0.3.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-05-01 09:32:08",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "ksrpc"
}