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 异步
4,761 每月下载量
用于 2 crates
44KB
533 行
actix-web-flash-messages
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"] }
- 基于会话的一个,
storage::SessionMessageStore
,使用sessions
功能标志。会话存储将Flash消息附加到当前会话。
[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
})
}
然后您将能够
- 使用
IncomingFlashMessages
提取器从传入的请求中提取FlashMessage
; - 使用
FlashMessage::send
在发送的响应中发送FlashMessage
。
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