9个版本

新版本 0.2.0 2024年8月19日
0.1.7 2024年8月4日
0.1.5 2024年7月31日
0.1.2 2024年6月27日

#441 in HTTP服务器

Download history 310/week @ 2024-06-05 35/week @ 2024-06-12 92/week @ 2024-06-26 7/week @ 2024-07-03 66/week @ 2024-07-24 448/week @ 2024-07-31 27/week @ 2024-08-07 122/week @ 2024-08-14

663 每月下载量

MIT/Apache

26KB
550

Velvet

(原始仓库:https://github.com/raffaeleragni/velvet)

重新包装和发布了一系列crates,以创建一个一致的、单一视角的特定Web栈。这并不是为了成为一个具有特定目的的库,而只是简化了常见设置和结构的样板。

关于使用它的项目参考/示例:https://github.com/raffaeleragni/veltes

使用的栈

模板和静态文件将被编译到二进制文件中,并且这些目录在运行时不需要。

栈的元素

  • WEB: Axum
  • DB: sqlx(postgres)
  • 模板化: Askama (文件夹 templates/)
  • 遥测: 支持sentry

基本路由设置

use velvet::prelude::*;

fn index() -> &'static str {
    "Hello world"
}

#[tokio::main]
async fn main() {
    App::new()
        .router(Router::new().route("/", get(index)))
        .start()
        .await;
}

添加数据库

use velvet::prelude::*;

fn index(Extension(db): Extension<Pool<Postgres>>) -> &'static str {
    let result = query_as!(String, "select 1").fetch_one(&db).await?;
    result
}

#[tokio::main]
async fn main() {
    let db = database().await;

    App::new()
        .router(Router::new().route("/", get(index))
        .inject(db)
        .start()
        .await;
}

支持静态文件

示例

use velvet::prelude::*;

#[tokio::main]
async fn main() {
    #[derive(RustEmbed)]
    #[folder = "statics"]
    struct S;

    App::new()
        .statics::<S>()
        .start()
        .await;
}

在哪里找到...

  • 状态(无操作): http GET /status/liveness
  • 指标: http GET /metrics/prometheus

环境变量

  • SERVER_BIND: 监听ip
  • SERVER_PORT: [number] 监听端口
  • DATABASE_URL: postgres://user:pass@host:port/database (如果使用数据库)
  • DATABASE_MAX_CONNECTIONS: [number] (默认1)
  • STRUCTURED_LOGGING: true|false (默认false)
  • SENTRY_URL: 发送遥测到sentry的url(包括密钥)

要设置TLS,请使用环境变量

  • TLS=true (或任何字符串)
  • TLS_PEM_CERT=cert.pem
  • TLS_PEM_KEY=key.pem

依赖项

~34–54MB
~1M SLoC