• Python- JSON-RPC创建一个远程过程调用


    我们使用JSON-RPC创建一个远程过程调用的例子,我们将使用jsonrpcserver库和Flask框架创建一个后端服务,并使用jsonrpcclient作为客户端。这个例子将包括:

    1. 一个计算服务,提供加、减、乘、除四个方法。
    2. 错误处理:除数为零时的错误。
    3. 使用Flask为服务器提供HTTP服务。

    服务器端

    首先,安装必要的库:

    pip install Flask jsonrpcserver
    
    • 1

    然后,编写服务器代码:

    from flask import Flask, request, jsonify, Response
    from jsonrpcserver import method, dispatch, Result, Success, Error
    
    app = Flask(__name__)
    
    @method
    def add(a, b) -> Result:
        return Success(a + b)
    
    @method
    def subtract(a, b) -> Result:
        return Success(a - b)
    
    @method
    def multiply(a, b) -> Result:
        return Success(a * b)
    
    @method
    def divide(a, b) -> Result:
        if b == 0:
            return Error(1, "Division by zero is not allowed")
        return Success(a / b)
    
    @app.route('/jsonrpc', methods=['POST'])
    def jsonrpc():
        print(request.get_data().decode())
    
    
        
        return Response(
            dispatch(request.get_data().decode()), content_type="application/json"
        )
    
    if __name__ == '__main__':
        app.run()
    
    # pip install Flask jsonrpcserver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    客户端

    首先,安装jsonrpcclient

    pip install jsonrpcclient[requests]
    
    • 1

    然后编写客户端代码:

    from jsonrpcclient import request, parse, Ok
    import requests
    
    def main():
        response = requests.post("http://127.0.0.1:5000/jsonrpc", json=request("divide", params=(6, 0)))
        parsed = parse(response.json())
    
        if isinstance(parsed, Ok):
            print(parsed.result)
        else:
            print(parsed.message)
    
    if __name__ == '__main__':
        main()
    
    # pip install jsonrpcclient[requests]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上述代码中,服务器使用Flask提供服务,并接受JSON-RPC请求。客户端发送请求到服务器,并处理服务器返回的错误。

    此示例展示了如何将JSON-RPC与Flask结合使用,为应用提供一个简单但功能强大的RPC框架。

    服务器端运行结果:

    majn@tiger:~$ python server.py
     * Serving Flask app 'server'
     * Debug mode: off
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
     * Running on http://127.0.0.1:5000
    Press CTRL+C to quit
    {"jsonrpc": "2.0", "method": "divide", "params": [6, 0], "id": 1}
    127.0.0.1 - - [11/Oct/2023 22:15:21] "POST /jsonrpc HTTP/1.1" 200 -
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    客户端运行结果:

    majn@tiger:~$ python client.py 
    Division by zero is not allowed
    
    • 1
    • 2

    在Python的包管理工具pip中,当看到[something]这种语法,它表示要安装的包的一个"额外"或可选的依赖。这是一个方式,使得包的作者可以提供一些可选的功能,这些功能需要额外的依赖来实现,但不是安装该包的核心功能所必需的。

    在这个例子中:

    pip install jsonrpcclient[requests]
    
    • 1

    表示正在安装jsonrpcclient包,并且想要与它一起安装支持requests库的可选依赖。在jsonrpcclient的情境下,[requests]意味着想要使用基于requests库的HTTP客户端来发送JSON-RPC请求。这是因为jsonrpcclient支持多种传输方式,而HTTP只是其中之一,而且requests是实现HTTP传输的一种方式。

    如果只执行pip install jsonrpcclient,那么只会获得核心的jsonrpcclient功能,不包括任何可选的依赖。然后,如果后来决定需要requests支持,可以再次执行上述命令来添加它。

  • 相关阅读:
    IK分词器
    给课题组师弟师妹的开荒手册(终篇)
    MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结
    SOD酶活性测定丨Abbkine超氧化物歧化酶(SOD)活性检测试剂盒
    固定资产管理子系统报表分为什么大类,包括哪些科目
    Epoxy:跨不同数据存储的 ACID 事务
    【Django学习笔记 - 13】:关联查询(日期查询、一对一查询、一对多查询、多对多查询)
    【机器人最短路径规划问题(栅格地图)】基于模拟退火算法求解
    国民技术 N32G45x 串口踩坑
    18.客户端会话技术Cookie
  • 原文地址:https://blog.csdn.net/weixin_43844521/article/details/133780053