我正在探索将镍RS用于Web应用程序,因此我目前正在编写一些基本程序来复制我已经能够使用python和flask实现的行为。对于这种特定情况,我想跟踪特定路由的请求数量。在 python 中,使用全局变量很容易,并且我假设 Global Interpreter Lock 提供了一些保证,即一次只能由一件事访问该变量(这对于这个特定场景来说不是一个大问题)。然而,在 Rust 中,每次访问计数器时都必须使用相同的操作unsafe
,这似乎表明可能有一种安全的方式来实现应用程序状态?
我尝试使用Nickel::with_data(config)
where config 是一个包含单个 u64 的结构,并且通过使用 Request 实现的 server_data() 方法,我可以获得计数器的值,但是我设法通过借用写入结构的任何更改server_data() 结构的结果是可变的,但新值在方法调用之间不存在。
我试图适应这里发生的事情。
到目前为止,我设法开始工作的唯一方法是这篇文章中包含的代码。
#[macro_use]
extern crate nickel;
use nickel::{Nickel, HttpRouter};
static mut REQUEST_COUNT: u64 = 0;
fn main() {
let mut nickel_app = Nickel::new();
nickel_app.get("/", middleware! {
unsafe {
println!("REQUEST_COUNT: {} -> {}", REQUEST_COUNT, REQUEST_COUNT + 1u64);
REQUEST_COUNT += 1u64;
}
"index"
});
nickel_app.get("/req", middleware! {
unsafe {
format!("REQUEST_COUNT is {}", REQUEST_COUNT)
}
});
match nickel_app.listen("127.0.0.1:8080") {
Ok(_) => {}
Err(_) => {
panic!("Couldn't bind to 127.0.0.1:8080")
}
}
}