• python rpc


    1. 安装依赖

    # 服务端
    pip install jsonrpcserver
    # 客户端
    pip install jsonrpcclient
    

     

    2. 服务端 

    2.1 基本使用案例

    from jsonrpcserver import Success, method, serve
    
    @method
    def ping():
        return Success("pong")
    
    if __name__ == "__main__":
        serve()
    

     

    2.2 基于aiohttp案例

    from aiohttp import web
    from jsonrpcserver import method, Result, Success, async_dispatch
    
    
    @method
    async def ping() -> Result:
        return Success("pong")
    
    
    async def handle(request):
        return web.Response(
            text=await async_dispatch(await request.text()), content_type="application/json"
        )
    
    
    app = web.Application()
    app.router.add_post("/", handle)
    
    if __name__ == "__main__":
        web.run_app(app, port=5000)
    

      

    2.3 基于django案例

    from django.http import HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    from jsonrpcserver import method, Result, Success, dispatch
    
    
    @method
    def ping() -> Result:
        return Success("pong")
    
    
    @csrf_exempt
    def jsonrpc(request):
        return HttpResponse(
            dispatch(request.body.decode()), content_type="application/json"
        )
    

      

    2.4 基于fastApi

    from fastapi import FastAPI, Request, Response
    from jsonrpcserver import Result, Success, dispatch, method
    import uvicorn
    
    app = FastAPI()
    
    
    @method
    def ping() -> Result:
        return Success("pong")
    
    
    @app.post("/")
    async def index(request: Request):
        return Response(dispatch(await request.body()))
    
    
    if __name__ == "__main__":
        uvicorn.run(app, port=5000)
    

      

    2.5 基于flask

    from flask import Flask, Response, request
    from jsonrpcserver import method, Result, Success, dispatch
    
    app = Flask(__name__)
    
    
    @method
    def ping() -> Result:
        return Success("pong")
    
    
    @app.route("/", methods=["POST"])
    def index():
        print(request.get_data().decode())
        return Response(
            dispatch(request.get_data().decode()), content_type="application/json"
        )
    
    
    if __name__ == "__main__":
        app.run()
    

      

    2.6 基于http

    from http.server import BaseHTTPRequestHandler, HTTPServer
    
    from jsonrpcserver import method, Result, Success, dispatch
    
    
    @method
    def ping() -> Result:
        return Success("pong")
    
    
    class TestHttpServer(BaseHTTPRequestHandler):
        def do_POST(self):
            # Process request
            request = self.rfile.read(int(self.headers["Content-Length"])).decode()
            response = dispatch(request)
            # Return response
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.end_headers()
            self.wfile.write(response.encode())
    
    
    if __name__ == "__main__":
        HTTPServer(("localhost", 5000), TestHttpServer).serve_forever()
    

      

    2.7 基于sanic

    from sanic import Sanic
    from sanic.request import Request
    from sanic.response import json
    from jsonrpcserver import Result, Success, dispatch_to_serializable, method
    
    app = Sanic("JSON-RPC app")
    
    
    @method
    def ping() -> Result:
        return Success("pong")
    
    
    @app.route("/", methods=["POST"])
    async def test(request: Request):
        return json(dispatch_to_serializable(request.body))
    
    
    if __name__ == "__main__":
        app.run(port=5000)
    

      

    2.8 基于socket

    from flask import Flask
    from flask_socketio import SocketIO, send
    from jsonrpcserver import method, Result, Success, dispatch
    
    app = Flask(__name__)
    socketio = SocketIO(app)
    
    
    @method
    def ping() -> Result:
        return Success("pong")
    
    
    @socketio.on("message")
    def handle_message(request):
        if response := dispatch(request):
            send(response, json=True)
    
    
    if __name__ == "__main__":
        socketio.run(app, port=5000)
    

      

    2.9 基于tornado

    from jsonrpcserver import method, Result, Success, async_dispatch
    from tornado import ioloop, web
    
    
    @method
    async def ping() -> Result:
        return Success("pong")
    
    
    class MainHandler(web.RequestHandler):
        async def post(self) -> None:
            request = self.request.body.decode()
            if response := await async_dispatch(request):
                self.write(response)
    
    
    app = web.Application([(r"/", MainHandler)])
    
    if __name__ == "__main__":
        app.listen(5000)
        ioloop.IOLoop.current().start()
    

      

    2.10 基于websocket

    import asyncio
    
    from jsonrpcserver import method, Success, Result, async_dispatch
    import websockets
    
    
    @method
    async def ping() -> Result:
        return Success("pong")
    
    
    async def main(websocket, path):
        if response := await async_dispatch(await websocket.recv()):
            await websocket.send(response)
    
    
    start_server = websockets.serve(main, "localhost", 5000)
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
    

      

    3. 客户端

    from jsonrpcclient import request
    request("ping", params={"key": "val"})
    

      

     

  • 相关阅读:
    几个关于集合的有趣证明
    SICP 作业2.5
    有关集合大小的比较
    2020 ICPC 小米邀请赛 部分题解
    Hello World!
    【图论】BellmanFord算法
    【图论】格子图
    【图论】BFS
    【图论】二分图最大匹配 | 二分图最大独立集 | 二分图最小点覆盖
    【图论】最大权不相交区间
  • 原文地址:https://www.cnblogs.com/navysummer/p/15983814.html
Copyright © 2020-2023  润新知