actix-web-flash-messages

Flash messages for actix-web


Crates.io version Download docs.rs docs


Web applications sometimes need to show a one-time notification to the user - e.g. an error message after having failed to login.
These notifications are commonly called flash messages.

actix-web-flash-messages provides a framework to work with flash messages in actix-web, closely modeled after Django's message framework.

```rust use actixweb::{Responder, HttpResponse, get,http}; use actixwebflashmessages::{ 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) } ```

How to install

Add actix-web-flash-messages to your dependencies:

```toml [dependencies]

...

actix-web = "4" actix-web-flash-messages = "0.4" ```

By default, actix-web-flash-messages does not provide any storage backend to receive and send flash messages.
You can enable:

```toml [dependencies]

...

actix-web-flash-messages = { version = "0.4", features = ["cookies"] } ```

```toml [dependencies]

...

actix-web-flash-messages = { version = "0.4", features = ["sessions"] } ```

You can provide a different message store by implementing the [storage::FlashMessageStore] trait.

Examples

You can find examples of application using actix-web-flash-messages on GitHub:

The Structure of a Flash Message

[FlashMessage]s are made of a [Level] and a string of content.

The message level can be used for filtering and rendering - for example:

You can build a [FlashMessage] via [FlashMessage::new] by specifying its content and [Level].
You can also use the shorter level-based constructors - e.g. [FlashMessage::info].

Enabling Flash Messages

To start sending and receiving flash messages you need to register [FlashMessagesFramework] as a middleware on your actix_web's App:

```rust use actixwebflashmessages::{FlashMessagesFramework, storage::CookieMessageStore}; use actixweb::{HttpServer, App, web}; use actix_web::cookie::Key;

[actix_web::main]

async fn main() { let signingkey = Key::generate(); // This will usually come from configuration! let messagestore = CookieMessageStore::builder(signingkey).build(); let messageframework = FlashMessagesFramework::builder(message_store).build();

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

} ```

You will then be able to:

```rust use actixweb::{Responder, HttpResponse, get}; use actixwebflashmessages::{ 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 { // [...] } ```

Framework Configuration

There are a few knobs that you can tweak when it comes to [FlashMessagesFramework].
Use [FlashMessagesFramework::builder] to get access to its fluent configuration API, built around [FlashMessagesFrameworkBuilder].

Minimum Level

By default, [FlashMessagesFramework] will only dispatch messages at info-level or above, discarding debug-level messages.
You can change this setting using [FlashMessagesFrameworkBuilder::minimum_level].

```rust use actixwebflashmessages::{FlashMessagesFramework, Level, storage::CookieMessageStore}; use actixweb::{HttpServer, App, web};

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

[actix_web::main]

async fn main() { // Show debug-level messages when developing locally let minimumlevel = match std::env::var("APPENV") { Ok(s) if &s == "local" => Level::Debug, _ => Level::Info, }; let messageframework = FlashMessagesFramework::builder(getmessagestore()) .minimumlevel(minimum_level) .build();

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

} ```

Message Storage

actix-web-flash-messages provides a cookie-based implementation of flash messages, [storage::CookieMessageStore], using a signed cookie to store and retrieve messages.
You can provide a different message store by implementing the [storage::FlashMessageStore] trait.

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.