Mojo 是一种结合了 Python 的可读性和 C++ 的速度的语言。
它对于不同的事情很有用,从接近硬件的低级代码,通过后端 API 设计,到前端和 Web 世界。 Mojo 功能强大,足以扩展到整个现代堆栈。该语言的设计还考虑到了人工智能和机器学习,因此它对于人工智能开发人员和数据科学家特别有用。
不过,Mojo 还很年轻。该生态系统一直缺少日常软件开发的工具,例如网络或基本的 HTTP 操作。
Lightbug 🔥🐝是一个用纯 Mojo 编写的简单 HTTP 框架,默认没有外部依赖。它旨在作为更复杂项目的基础,并允许您开发 API 等 Web 服务、设置基本路由,甚至使用 Mojo 提供 HTML 页面,同时利用该语言的功能,例如静态类型和出色的性能。
首先,只需安装 Mojo和Git ,然后克隆 Lightbug Github 存储库:
git clone https://github.com/saviorand/lightbug_http.git
克隆后,切换到命令行中的目录:
cd lightbug_http
然后运行服务器(是的,这就是 Mojo 文件扩展名!🔥):
mojo lightbug.🔥
您应该看到以下行打印到控制台:
🔥🐝 Lightbug is listening on 0.0.0.0:8080 Ready to accept connections...
现在,您可以开始向服务器发出请求,或者尝试在浏览器中打开localhost:8080
或0.0.0.0:8080
— 您应该会看到介绍屏幕。欢迎来到 Mojo 风格的网络!现在,让我们开始一些真正的编码。
虽然 Lightbug 还很年轻,但人们期望能够为现代 Web 开发的核心功能已经存在。
请注意,由于还没有包管理器,您只需将lightbug_http
作为子文件夹包含在您自己的项目中即可。这将作为Mojo 包运行,并允许您从 Lightbug 导入 Web 原语、服务器等工具。
例如,将其添加到文件顶部以导入服务器:
from lightbug_http.sys.server import SysServer
这将导入纯 Mojo 中的服务器实现。如果您想使用 Python 实现,请导入PythonServer
。它将以同样的方式工作。
要创建 HTTP 服务,只需创建一个满足HTTPService
特征的结构,这意味着它有一个带有以下签名的func
方法:
trait HTTPService: fn func(self, req: HTTPRequest) raises -> HTTPResponse: ...
它使用内置原语来接收HTTPRequest
,执行您在 Mojo 或 Python 中编写的任何自定义逻辑,并将包含一些数据的HTTPResponse
对象返回给 API 使用者。
让我们创建一个服务,将发送到0.0.0.0:8080
的所有请求打印到控制台。为此,请创建一个名为my_awesome_service.🔥
的文件,并粘贴以下内容:
from lightbug_http import * @value struct Printer(HTTPService): fn func(self, req: HTTPRequest) raises -> HTTPResponse: let body = req.body_raw print(String(body)) return OK(body) fn main() raises: var server = SysServer() let handler = Printer() server.listen_and_serve("0.0.0.0:8080", handler)
运行mojo my_awesome_service.🔥
,然后从您最喜欢的 API 客户端(例如Insomnia或Bruno )将请求发送到0.0.0.0:8080
。您应该会看到有关打印到控制台的请求的一些详细信息。
恭喜!您现在正式成为一名 Mojo Web 开发人员 🔥。
在示例中,为了清楚起见,我们使用let
初始化一个名为handler
的变量(意味着它不能重新分配)并将其作为第二个参数传递给listen_and_serve
。
添加@value
装饰器是可选的:如果您是高级 Mojician,则可以添加__init__
构造函数方法。效果是一样的; @value
只是自动生成这个方法和其他有用的方法。
struct Printer(HTTPService): fn __init__(inout self): print("Printer initialized!") fn func(self, req: HTTPRequest) raises -> HTTPResponse: let body = req.body_raw print(String(body)) return OK(body)
您可能会说,但这只是一条路线!现代 API 需要的远不止这些。
Lightbug 还可以进行一些基本的路由:
@value struct ExampleRouter(HTTPService): fn func(self, req: HTTPRequest) raises -> HTTPResponse: let body = req.body_raw let uri = req.uri() if uri.path() == "/": print("I'm on the index path!") if uri.path() == "/first": print("I'm on /first!") elif uri.path() == "/second": print("I'm on /second!") return OK(body)
将其添加到您的my_awesome_service.🔥
,并将其作为处理程序传递到服务器:
fn main() raises: var server = SysServer() let handler = ExampleRouter() server.listen_and_serve("0.0.0.0:8080", handler)
您现在可以打开浏览器并转到localhost:8080/first
、 localhost:8080/second
来查看更改。
此功能应该为您开发自己的使用 HTTP 的应用程序、库和服务奠定基础,同时利用lightbug_http
轻量级框架/工具包可以提供的灵活性和自定义选项。
我们计划在未来通过构建lightbug_api
和lightbug_web
包,使路由以及其他任务(例如根据 OpenAPI 规范编写和生成 API、设计数据模型以及构建 Web 应用程序)变得更加有趣。查看我们的路线图了解详细信息。
这是一个开源、非商业社区项目。
请为我们的Github 存储库加注星标,加入Discord ,并查看如何贡献您的代码,以便我们为其他 Mojicians 做得更好。
下次见!