parent
af30c552ac
commit
cde08fe788
@ -0,0 +1,70 @@ |
||||
#![feature(proc_macro_hygiene, decl_macro)] |
||||
#[macro_use] |
||||
extern crate rocket; |
||||
|
||||
use rocket::response::content::Html; |
||||
use rocket::response::Redirect; |
||||
use rocket::request::Form; |
||||
|
||||
type Session<'a> = rocket_session::Session<'a, Vec<String>>; |
||||
|
||||
fn main() { |
||||
rocket::ignite() |
||||
.attach(Session::fairing()) |
||||
.mount("/", routes![index, add, remove]) |
||||
.launch(); |
||||
} |
||||
|
||||
#[get("/")] |
||||
fn index(session: Session) -> Html<String> { |
||||
let mut page = String::new(); |
||||
page.push_str(r#" |
||||
<!DOCTYPE html> |
||||
<h1>My Dogs</h1> |
||||
|
||||
<form method="POST" action="/add"> |
||||
Add Dog: <input type="text" name="name"> <input type="submit" value="Add"> |
||||
</form> |
||||
|
||||
<ul> |
||||
"#); |
||||
|
||||
session.tap(|sess| { |
||||
for (n, dog) in sess.iter().enumerate() { |
||||
page.push_str(&format!(r#" |
||||
<li>🐶 {} <a href="/remove/{}">Remove</a></li> |
||||
"#, dog, n)); |
||||
} |
||||
}); |
||||
|
||||
page.push_str(r#" |
||||
</ul> |
||||
"#); |
||||
|
||||
Html(page) |
||||
} |
||||
|
||||
#[derive(FromForm)] |
||||
struct AddForm { |
||||
name: String, |
||||
} |
||||
|
||||
#[post("/add", data="<dog>")] |
||||
fn add(session: Session, dog : Form<AddForm>) -> Redirect { |
||||
session.tap(move |sess| { |
||||
sess.push(dog.into_inner().name); |
||||
}); |
||||
|
||||
Redirect::found("/") |
||||
} |
||||
|
||||
#[get("/remove/<dog>")] |
||||
fn remove(session: Session, dog : usize) -> Redirect { |
||||
session.tap(|sess| { |
||||
if dog < sess.len() { |
||||
sess.remove(dog); |
||||
} |
||||
}); |
||||
|
||||
Redirect::found("/") |
||||
} |
@ -0,0 +1,72 @@ |
||||
//! This demo is a page visit counter, with a custom cookie name, length, and expiry time.
|
||||
//!
|
||||
//! The expiry time is set to 10 seconds to illustrate how a session is cleared if inactive.
|
||||
|
||||
#![feature(proc_macro_hygiene, decl_macro)] |
||||
#[macro_use] |
||||
extern crate rocket; |
||||
|
||||
use std::time::Duration; |
||||
use rocket::response::content::Html; |
||||
|
||||
#[derive(Default, Clone)] |
||||
struct SessionData { |
||||
visits1: usize, |
||||
visits2: usize, |
||||
} |
||||
|
||||
// It's convenient to define a type alias:
|
||||
type Session<'a> = rocket_session::Session<'a, SessionData>; |
||||
|
||||
fn main() { |
||||
rocket::ignite() |
||||
.attach(Session::fairing() |
||||
// 10 seconds of inactivity until session expires
|
||||
// (wait 10s and refresh, the numbers will reset)
|
||||
.with_lifetime(Duration::from_secs(10)) |
||||
// custom cookie name and length
|
||||
.with_cookie_name("my_cookie") |
||||
.with_cookie_len(20) |
||||
) |
||||
.mount("/", routes![index, about]) |
||||
.launch(); |
||||
} |
||||
|
||||
#[get("/")] |
||||
fn index(session: Session) -> Html<String> { |
||||
// Here we build the entire response inside the 'tap' closure.
|
||||
|
||||
// While inside, the session is locked to parallel changes, e.g.
|
||||
// from a different browser tab.
|
||||
session.tap(|sess| { |
||||
sess.visits1 += 1; |
||||
|
||||
Html(format!(r##" |
||||
<!DOCTYPE html> |
||||
<h1>Home</h1> |
||||
<a href="/">Refresh</a> • <a href="/about/">go to About</a> |
||||
<p>Visits: home {}, about {}</p> |
||||
"##, |
||||
sess.visits1, |
||||
sess.visits2 |
||||
)) |
||||
}) |
||||
} |
||||
|
||||
#[get("/about")] |
||||
fn about(session: Session) -> Html<String> { |
||||
// Here we return a value from the tap function and use it below
|
||||
let count = session.tap(|sess| { |
||||
sess.visits2 += 1; |
||||
sess.visits2 |
||||
}); |
||||
|
||||
Html(format!(r##" |
||||
<!DOCTYPE html> |
||||
<h1>About</h1> |
||||
<a href="/about">Refresh</a> • <a href="/">go home</a> |
||||
<p>Page visits: {}</p> |
||||
"##, |
||||
count |
||||
)) |
||||
} |
Loading…
Reference in new issue