如何使用Rust实现应用程序状态?

时间:2019-07-12 14:43:07

标签: rust nickel

我正在探索将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")
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我正在寻找this,这是一种访问某种应用程序状态的安全方法。