它就像 Ruby on Rails,但用于 Rust。

获得与 Rails 相同的出色构建体验,以及 Rust 令人难以置信的性能和安全性。

是时候让 Rust 成为你的超能力了。

使用 Loco 的 Rust 非常容易。 凭借简单的请求生命周期、
代码生成器、生产力工具包等等。

$ cargo loco generate scaffold post title:string content:text
added: "src/controllers/post.rs" injected: "src/controllers/mod.rs" injected: "src/app.rs" ...
$ cargo loco start
▄ ▀ ▀ ▄ ▄ ▀ ▄ ▄ ▄▀ ▄ ▀▄▄ ▄ ▀ ▀ ▀▄▀█▄ ▀█▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▀▀█ ██████ █████ ███ █████ ███ █████ ███ ▀█ ██████ █████ ███ █████ ▀▀▀ █████ ███ ▄█▄ ██████ █████ ███ █████ █████ ███ ████▄ ██████ █████ ███ █████ ▄▄▄ █████ ███ █████ ██████ █████ ███ ████ ███ █████ ███ ████▀ ▀▀▀██▄ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ██▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ https://loco.rs
environment: development database: automigrate logger: disabled compilation: debug modes: server
listening on localhost:5150

享受甜蜜而轻松的 Rust 性能

Loco 包含许多功能,并且提供 Node.js 10 倍的性能

在本地构建应用程序并节省大量时间。

无需 SaaS 或云服务。 通过开箱即用的身份验证、workers、电子邮件等功能节省时间、金钱和精力。

impl Model {
  pub async fn find_by_email(db: &DatabaseConnection, email: &str)
  -> ModelResult<Self> {

      Users::find()
        .filter(eq(Column::Email, email))
        .one(db).await?
        .ok_or_else(|| ModelError::EntityNotFound)
  }
  
  pub async fn create_report(&self, ctx: &AppContext) -> Result<()> {
      ReportWorker::perform_later(
        &ctx, 
        ReportArgs{ user_id: self.id }
      ).await?;
  }
}

模型

使用 SeaORM 构建丰富的实体模型,避免编写 SQL。在实体上构建关系、验证和自定义逻辑,以获得最佳维护性。

pub async fn get_one(
    respond_to: RespondTo,
    Path(id): Path<i32>,
    State(ctx): State<AppContext>,
) -> Result<Response> {
    let item = Notes::find_by_id(id).one(&ctx.db).await?;
    match respond_to {
      RespondTo::Html => html_view(&item),
      _ => format::json(item),
    }
}

pub fn routes() -> Routes {
    Routes::new()
      .prefix("notes")
      .add("/{id}", get(get_one))
}

控制器

处理 Web 请求参数、主体、验证和渲染响应,根据内容进行响应。我们使用 Axum 来获得最好的性能、简洁性和可扩展性。


// Literals
format::text("Loco")

// Tera view engine
format::render().view(v, "home/hello.html", json!({}))

// strongly typed JSON responsed, backed by `serde`
format::json(Health { ok: true })

// Etags, cookies, and more
format::render().etag("loco-etag")?.empty()

视图

使用服务器渲染的模板,如 Tera 或 JSON。Loco 可以在服务器上渲染视图,或者无缝地与前端应用程序一起工作。根据您的需求配置完整的前端和后端设置。

impl worker::Worker<DownloadArgs> for UsersReportWorker {
    async fn perform(&self, args: DownloadArgs) -> worker::Result<()> {
        let all = Users::find()
          .all(&self.ctx.db)
          .await
          .map_err(Box::from)?;
        for user in &all {
          println!("user: {}", user.id);
        }
        Ok(())
    }
}

后台任务

在后台执行计算密集型或 I/O 密集型任务,使用 Redis 支持的队列,或者使用线程。实现一个工作者只需要为 Worker 特征实现 perform 函数。


$ cargo loco generate deployment
? ❯ Choose your deployment ›
 Docker
 Shuttle
 Nginx

..
 ❯ Choose your deployment · Docker
skipped (exists): "dockerfile"
added: ".dockerignore"

部署

轻松生成部署配置,使用交互式 CLI 界面选择部署选项。根据您的需求选择合适的部署设置。

jobs:
  db_vaccum:
    run: "db_vaccum.sh"
    shell: true
    schedule: "0 0 * * *"
    tags: ["maintenance"]

  send_birthday:
    run: "user_birthday_task"
    schedule: "Run every 2 hours"
    tags: ["marketing"]
       

调度器

简化传统的,经常笨拙的 crontab 系统,使任务或 shell 脚本的调度更容易和更优雅。