17个版本

0.4.2 2022年10月24日
0.4.1 2022年6月27日
0.3.3 2022年6月26日
0.3.2 2022年2月25日
0.2.4 2021年11月25日

#201 in 异步

Download history 1142/week @ 2024-03-14 1195/week @ 2024-03-21 1133/week @ 2024-03-28 1081/week @ 2024-04-04 1231/week @ 2024-04-11 1262/week @ 2024-04-18 1233/week @ 2024-04-25 1159/week @ 2024-05-02 1059/week @ 2024-05-09 1153/week @ 2024-05-16 1162/week @ 2024-05-23 1080/week @ 2024-05-30 1144/week @ 2024-06-06 1263/week @ 2024-06-13 1185/week @ 2024-06-20 1038/week @ 2024-06-27

4,761 每月下载量
用于 2 crates

MIT/Apache

44KB
533

actix-web-flash-messages

用于actix-web的Flash消息


Web应用有时需要向用户显示一次性的通知 - 例如登录失败后的错误消息。
这些通知通常被称为Flash消息

actix-web-flash-messages提供了一个框架,用于在actix-web中处理Flash消息,其结构与Django的消息框架相似。

use actix_web::{Responder, HttpResponse, get,http};
use actix_web_flash_messages::{
    FlashMessage, IncomingFlashMessages,
};
use std::fmt::Write;

/// Attach two flash messages to the outgoing response,
/// a redirect.
#[get("/set")]
async fn set() -> impl Responder {
    FlashMessage::info("Hey there!").send();
    FlashMessage::debug("How is it going?").send();
    // Redirect to /show
    HttpResponse::TemporaryRedirect()
        .insert_header((http::header::LOCATION, "/show"))
        .finish()
}

/// Pick up the flash messages attached to the request, showing
/// them to the user via the request body.
#[get("/show")]
async fn show(messages: IncomingFlashMessages) -> impl Responder {
    let mut body = String::new();
    for message in messages.iter() {
        writeln!(body, "{} - {}", message.content(), message.level()).unwrap();
    }
    HttpResponse::Ok().body(body)
}

如何安装

actix-web-flash-messages添加到依赖项

[dependencies]
# ...
actix-web = "4"
actix-web-flash-messages = "0.4"

默认情况下,actix-web-flash-messages不提供任何存储后端以接收和发送Flash消息。
您可以选择启用

  • 基于cookie的一个,storage::CookieMessageStore,使用cookies功能标志。cookie存储使用签名cookie来存储和检索消息;
[dependencies]
# ...
actix-web-flash-messages = { version = "0.4", features = ["cookies"] }
[dependencies]
# ...
actix-web-flash-messages = { version = "0.4", features = ["sessions"] }

您可以通过实现storage::FlashMessageStore trait来提供不同的消息存储。

示例

您可以在GitHub上找到使用actix-web-flash-messages的应用示例

Flash消息的结构

FlashMessage由一个Level和一个内容字符串组成。

消息级别可用于过滤和渲染 - 例如

  • 在生产环境中,只显示 info 级别或以上的闪存消息,同时保留 debug 级别的消息用于本地开发;
  • 在UI中使用不同的颜色来显示消息(例如,错误用红色,警告用橙色等);

您可以通过指定其内容和 Level 来构建 FlashMessage,通过 FlashMessage::new 方法。
您还可以使用基于级别的简短构造函数 - 例如,FlashMessage::info

启用闪存消息

要开始发送和接收闪存消息,您需要将 FlashMessagesFramework 注册为您的 actix_web's App 的中间件。

use actix_web_flash_messages::{FlashMessagesFramework, storage::CookieMessageStore};
use actix_web::{HttpServer, App, web};
use actix_web::cookie::Key;

#[actix_web::main]
async fn main() {
    let signing_key = Key::generate(); // This will usually come from configuration!
    let message_store = CookieMessageStore::builder(signing_key).build();
    let message_framework = FlashMessagesFramework::builder(message_store).build();
    
    HttpServer::new(move || {
        App::new()
            .wrap(message_framework.clone())
            // [...] your endpoints
    })
}

然后您将能够

use actix_web::{Responder, HttpResponse, get};
use actix_web_flash_messages::{
    FlashMessage, IncomingFlashMessages,
};

/// Send a flash messages alongside the outgoing response, a redirect.
#[get("/set")]
async fn set() -> impl Responder {
    FlashMessage::info("Hey there!").send();
    // [...]
}

/// Extract the flash message from the incoming request.
#[get("/show")]
async fn show(_messages: IncomingFlashMessages) -> impl Responder {
    // [...]
}

框架配置

在配置 FlashMessagesFramework 时,有几个可以调整的旋钮。
使用 FlashMessagesFramework::builder 来获取其流畅配置API的访问权限,该API围绕 FlashMessagesFrameworkBuilder 构建。

最小级别

默认情况下,FlashMessagesFramework 只会分发 info 级别或以上的消息,丢弃 debug 级别的消息。
您可以使用 FlashMessagesFrameworkBuilder::minimum_level 改变此设置。

use actix_web_flash_messages::{FlashMessagesFramework, Level, storage::CookieMessageStore};
use actix_web::{HttpServer, App, web};

fn get_message_store() -> CookieMessageStore {
    // [...]
    # CookieMessageStore::builder(actix_web::cookie::Key::generate()).build()
}

#[actix_web::main]
async fn main() {
    // Show debug-level messages when developing locally
    let minimum_level = match std::env::var("APP_ENV") {
        Ok(s) if &s == "local" => Level::Debug,
        _ => Level::Info,
    };
    let message_framework = FlashMessagesFramework::builder(get_message_store())
        .minimum_level(minimum_level)
        .build();

    HttpServer::new(move || {
        App::new()
            .wrap(message_framework.clone())
            // [...] Your endpoints
    })
}

消息存储

actix-web-flash-messages 提供了一种基于cookie的闪存消息实现,storage::CookieMessageStore,使用签名cookie来存储和检索消息。
您可以通过实现storage::FlashMessageStore trait来提供不同的消息存储。

许可证

根据您的选择,许可协议为Apache License,Version 2.0或MIT许可证。除非您明确声明,否则您有意提交以包含在此包中的任何贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何额外的条款或条件。

依赖关系

~15–26MB
~456K SLoC