一个用于构建基于HTTP的服务器应用程序的Python框架
项目描述
Rolo HTTP: 一个用于构建基于HTTP的服务器应用程序的Python框架。
Rolo HTTP
罗洛是一个灵活的框架和库,用于构建基于HTTP的服务器应用程序,不仅限于微服务和REST API。您可以使用罗洛构建基于HTTP的RPC服务器、WebSocket代理或其他典型Web框架未设计的服务器类型。
罗洛扩展了Werkzeug,这是一个灵活的Python HTTP服务器库,让您可以使用熟悉的如Router
、Request
、Response
或@route
等概念。它引入了Gateway
和HandlerChain
的概念,这是责任链模式的实现变体。
罗洛是为不使用asyncio但仍然需要异步HTTP功能(如HTTP2 SSE或Websockets)的环境设计的。为了允许异步通信,罗洛引入了一个ASGI/WSGI桥接器,允许您通过像Hypercorn这样的ASGI服务器来托管罗洛应用程序。
用法
默认路由器示例
路由器基于Werkzeug的URL映射,但直接调度到处理函数。@route
装饰器的工作方式类似于Flask或FastAPI,但它们不绑定到应用对象。相反,您可以在函数或方法上定义路由,然后将它们直接添加到路由器。
from rolo import Router, route, Response
from werkzeug import Request
from werkzeug.serving import run_simple
@route("/users")
def user(_request: Request, args):
assert not args
return Response("user")
@route("/users/<int:user_id>")
def user_id(_request: Request, args):
assert args
return Response(f"{args['user_id']}")
router = Router()
router.add(user)
router.add(user_id)
# convert Router to a WSGI app and serve it through werkzeug
run_simple('localhost', 8080, router.wsgi(), use_reloader=True)
Pydantic集成
路由器使用调度器将请求调度到函数。在之前的示例中,默认调度器使用字典形式的请求参数调用函数和Request
对象。"处理器调度器"可以将函数转换为更类似Flask或FastAPI的函数,同时允许您与Pydantic集成。以下是如何将FastAPI文档中的默认示例与罗洛一起使用的示例:
import pydantic
from werkzeug import Request
from werkzeug.serving import run_simple
from rolo import Router, route
class Item(pydantic.BaseModel):
name: str
price: float
is_offer: bool | None = None
@route("/", methods=["GET"])
def read_root(request: Request):
return {"Hello": "World"}
@route("/items/<int:item_id>", methods=["GET"])
def read_item(request: Request, item_id: int):
return {"item_id": item_id, "q": request.query_string}
@route("/items/<int:item_id>", methods=["PUT"])
def update_item(request: Request, item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
router = Router()
router.add(read_root)
router.add(read_item)
router.add(update_item)
# convert Router to a WSGI app and serve it through werkzeug
run_simple("localhost", 8080, router.wsgi(), use_reloader=True)
网关 & 处理器链
罗洛的Gateway
包含一组请求、响应、异常处理器以及请求终结器。然后,可以使用适当的托管适配器将网关实例作为WSGI或ASGI应用程序提供服务。以下是一个只有一个处理器的简单网关示例,该处理器返回被调用的URL和方法。
from werkzeug import run_simple
from rolo import Response
from rolo.gateway import Gateway, HandlerChain, RequestContext
from rolo.gateway.wsgi import WsgiGateway
def echo_handler(chain: HandlerChain, context: RequestContext, response: Response):
response.status_code = 200
response.set_json({"url": context.request.url, "method": context.request.method})
gateway = Gateway(request_handlers=[echo_handler])
app = WsgiGateway(gateway)
run_simple("localhost", 8080, app, use_reloader=True)
提供服务将产生
curl http://localhost:8080/hello-world
{"url": "http://localhost:8080/hello-world", "method": "GET"}
开发
快速入门
要将Python和其他开发需求安装到venv中,请运行
make install
格式化代码
我们使用black和isort作为代码风格工具。要执行它们,请运行
make format
构建发行版
要构建wheel和源发行版,只需运行
make dist
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。