我正在探索将ni-rs用于Web应用程序,因此,我目前正在编写一些基本程序,这些程序可以复制我已经可以使用python和flask实现的行为。对于这种特定情况,我想跟踪针对特定路由的请求数量。在python中,使用全局变量很容易,并且我认为全局解释器锁提供了某种保证,即一次只能由一个对象访问该变量(这在特定情况下并不是一个大问题)。但是,在Rust中,要做同样的事情,我每次访问计数器时都必须使用unsafe
,这似乎暗示着可以有一种安全的方法来实现应用程序状态?
我尝试使用Nickel::with_data(config)
,其中config是其中包含单个u64的结构,并且通过使用Request实现的server_data()方法,我可以获得计数器的值,但是我可以进行任何更改通过将server_data()结构结果作为可变变量来借以设法写入该结构,但是新值在方法调用之间没有持久。
我试图适应here正在发生的事情。
到目前为止,我设法工作的唯一方法是本文中包含的代码。
#[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")
}
}
}