我有一个名为 main.rs 的文件和一个名为 Rocket.rs 的文件。第一个用于发射另一个文件中定义的火箭:
main.rs
#[tokio::main]
async fn main(){
let rocket = rocket();
rocket.launch().await;
}
另一个具有火箭功能,并使用 Tera 模板将信息传递到 HTML。
rocket.rs
#[get("/end_point_example")]
fn end_point_example() -> Template {
let context: HashMap<&str, &str> = [("data1", "value1"), ("data2","value1")]
.iter().cloned().collect();
Template::render("end_point_example", &context)
}
#[launch]
pub fn rocket() ->_ {
rocket::build()
.mount("/static", FileServer::from("static"))
.mount("/", routes![end_point_example])
.attach(Template::fairing())
}
这工作得很好,但问题是我在主文件中有端点的上下文值(在本例中为 value1 和 value2)。如何将它们从 main.rs 传递到 Rocket.rs 中的端点?
我见过这种方法使用了
manage()
方法:
use std::sync::atomic::AtomicUsize;
struct HitCount {
count: AtomicUsize
}
#[launch]
pub fn rocket() ->_ {
rocket::build()
.manage(HitCount { count: AtomicUsize::new(0) });
.mount("/static", FileServer::from("static"))
.mount("/", routes![end_point_example])
.attach(Template::fairing())
}
#[get("/count")]
fn count(hit_count: &State<HitCount>) -> String {
let current_count = hit_count.count.load(Ordering::Relaxed);
format!("Number of visits: {}", current_count)
}
问题是构建和管理命令应该应用在 Rocket.rs 文件中,所以它没有帮助。你有什么建议吗?
(注意:考虑到显然我不需要
value1
和 value2
动态更改。一旦我在主体中评估它们,它们在整个运行过程中保持不变。)
在 Rocket.rs 文件中的 build() 之后不强制使用 manage() 函数,此解决方案工作正常:
main.rs
struct MyData {
data: usize,
}
#[tokio::main]
async fn main(){
let data = MyData{data:12};
let rocket = rocket().manage(data);
rocket.launch().await;
}
rocket.rs
#[get("/end_point")]
fn end_point(state: &State<MyData>) -> Template {
let context: HashMap<&str, String> = [("data",
state.data.to_string())]
.iter().cloned().collect();
Template::render("end_point", &context)
}
#[launch]
pub fn rocket() ->_ {
rocket::build()
.mount("/static", FileServer::from("static"))
.mount("/", routes![end_point])
.attach(Template::fairing())
}