rust - How to insert data submitted from an HTML form into a Redis database? -
i trying save user-submitted http data redis. code using nickel:
#[macro_use] extern crate nickel; extern crate redis; extern crate hyper; use redis::{client,parser, commands, connection, redisresult}; use nickel::{nickel, request, response, httprouter, middlewareresult,middleware, mediatype,jsonbody}; use std::collections::hashmap; use nickel::status::statuscode; use nickel_redis::{redismiddleware, redisrequestextensions}; use hyper::url; use url::form_urlencoded; use std::sync::{arc, mutex}; use std::io; use std::io::prelude::*; use std::fs::file; fn save_db<'a>(req: &mut request, res: response<'a>) -> middlewareresult<'a> { let mut server = nickel::new(); /* fixme: connect redis*/ let client = client::open("redis://127.0.0.1/").unwrap(); let conn = client.get_connection().unwrap(); server.post("/confirmation", middleware!{|req, res| let mut form_data = string::new(); req.origin.read_to_string(&mut form_data).unwrap(); let _: () = conn.set("contents", form_data).unwrap(); println!("{}", form_data); let mut data = hashmap::<&str, string>::new(); data.insert("content", form_data); data.insert("page_title", "save blog data".to_string()); return res.render("app/views/blog/save.tpl", &data); }); } fn main() { let mut server = nickel::new(); // start using router let mut router = nickel::router(); let client = client::open("redis://127.0.0.1/").unwrap(); let conn = client.get_connection().unwrap(); router.get("/test-save-db", save_db); server.utilize(router); server.listen("127.0.0.12:8080"); }
save.tpl
<!doctype html> <html> <head lang="en"> <meta charset="utf-8"> <title>{{ page_title }}</title> </head> <body> <h1>saved new blog.</h1> <h2>author {{form_data}}</h2> <h2>content {{content}}</h2> <form> first name:<br> <input type="text" name="firstname" > <br> <button type="submit" formenctype="application/x-www-form-urlencoded" formaction="/test-save-db" formmethod="post">send</button> </form> </body> </html>
but error
error: cannot infer appropriate lifetime lifetime parameter
'b
due conflicting requirements [e0495](req.origin.read_to_string(&mut form_data).unwrap();)
the problem see in code you're trying register handler route (post /confirmation
) inside handler gets called when /test-save-db
route matched. doesn't seem correct.
to make code , intent clearer, suggest use middleware!
macro, find simplest way describe routes in nickel. @ least has been experience since starting use framework yesterday :-)
so example might rewritten follows:
fn main() { let client = client::open("redis://127.0.0.1/").unwrap(); let mut server = nickel::new(); server.get("/test-save-db", middleware! { |req, res| // request , send response }); server.listen("127.0.0.12:8080"); }
if need multiple handlers sharing same client, need use std::sync::arc
have thread safe shared state, , clone each handler (it clone arc
, not client).
Comments
Post a Comment