跳转到主要内容

一个用于构建基于HTTP的服务器应用程序的Python框架

项目描述

Rolo HTTP

Rolo HTTP: 一个用于构建基于HTTP的服务器应用程序的Python框架。

Rolo HTTP

CI badge PyPI Version PyPI License Code style: black

罗洛是一个灵活的框架和库,用于构建基于HTTP的服务器应用程序,不仅限于微服务和REST API。您可以使用罗洛构建基于HTTP的RPC服务器、WebSocket代理或其他典型Web框架未设计的服务器类型。

罗洛扩展了Werkzeug,这是一个灵活的Python HTTP服务器库,让您可以使用熟悉的如RouterRequestResponse@route等概念。它引入了GatewayHandlerChain的概念,这是责任链模式的实现变体。

罗洛是为不使用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

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源发行版

rolo-0.7.1.tar.gz (68.0 kB 查看哈希值)

上传时间

构建发行版

rolo-0.7.1-py3-none-any.whl (62.8 kB 查看哈希值)

上传时间 Python 3

由以下组织支持