< 返回版块

eweca-d 发表于 2022-03-27 16:30

新手学着搭建网站,使用的框架是warp + svelte,然后遇到了一个问题。网站是使用cookie来控制的,大概是这样:

#[tokio::main]
async fn main() {
    let apis = warp::path("api").and(
        warp::post()
            .and(warp::body::bytes())
            .and(warp::cookie::optional("token"))
            .map(move |content: Bytes, token: Option<String>| {
                Response::builder().body(server::handle_post_request(content, token))
            }),
    );

    let main = warp::get().and(warp::fs::dir("main"));
    let login = warp::path("login").and(warp::fs::dir("login"));
    let finder = warp::path("finder").and(warp::fs::dir("finder"));

    let routers = main.or(login).or(finder).or(apis);

    warp::serve(routers).run(([127, 0, 0, 1], 8080)).await;
}

当然现在可以利用token控制来未授权用户不能使用任何功能,但我希望更进一步,如果是未授权用户(不带token或者token过期的),无论访问哪个路径,我想直接展示一个只包含跳转至login页面的特殊页面,比如'warp::fs::dir("guest")'。搜了几小时,资料太少了(或者是我没用到合适的关键词)。求大佬点拨一下!


找到了一个方法如下:

#[tokio::main]
async fn main() {
    let apis = warp::path("api").and(
        warp::post()
            .and(warp::body::bytes())
            .and(warp::cookie::optional("token"))
            .map(move |content: Bytes, token: Option<String>| {
                Response::builder().body(server::handle_post_request(content, token))
            }),
    );

    let main = warp::get()
        .and(warp::fs::dir("main"))
        .and(warp::fs::dir("login"))
        .and(warp::cookie::optional("token"))
        .map(move |main_page: warp::filters::fs::File, login_page: warp::filters::fs::File, token: Option<String>| {
            if server::check_token(token).is_err() {
                login_page
            } else {
                main_page
            }
        });
    let login = warp::path("login").and(warp::fs::dir("login"));
    let finder = warp::path("finder").and(warp::fs::dir("finder"));

    let routers = main.or(login).or(finder).or(apis);

    warp::serve(routers).run(([127, 0, 0, 1], 8080)).await;
}

还有啥更好的办法么?

评论区

写评论
zgzgzgzgzg 2022-03-28 11:49

支持solidjs和axum写程序

作者 eweca-d 2022-03-28 11:02

看了下tower,核心貌似是async fn(Request) -> Result<Response, Error>,感觉被我部分实现了,我的请求都是通过trait Request { fn handle(&self) -> String }来处理的,直接异步在server::handle_post_request里生成impl Request的struct并运行然后直接返回,因为返回的String已经是可以直接返回的json。有空我仔细看看tower吧。axum确实很多人强推,毕竟是tokio团队的牌子,之后也看看,反正单纯改web框架工作量不大。

CSS框架其实就是用的bulma,但是感觉用的不太好,哈哈。布局排版啥的对我目前水平来说太难了。localStorage看起来适合保存配置啊,有机会可以试试。但是对于传送身份认证用的token,因为每次请求都需要验证,所以我觉得可能还是cookie好用?至于vue,主要还是看重它的资料的丰富程度和易用性平衡的不错,性能啥的我是觉得够用就好。简单的页面用svelte确实是不错的。

感谢大佬的悉心指点,之后会重点看看SPA啥情况,再搞清楚下CSS布局方面的知识。

--
👇
c5soft: 1. 前端单页面应用(SPA)也是可以通过浏览器地址变更实现内部页面间跳转的...

c5soft 2022-03-28 09:49
  1. 前端单页面应用(SPA)也是可以通过浏览器地址变更实现内部页面间跳转的,需要用到svelte-spa-router这类部件。

  2. Axum的静态页面服务比warp更香。压缩文件优先读取与大文件分片下载这两项功能是warp没有的。大文件分片下载大家都用过吧,就是支持“迅雷”多线程断点续传。什么是压缩文件优先读取呢?假定服务器端同一个目录下有三个文件:abc.js、 abc.js.gz、abc.js.br,客户端要的是abc.js, 同时客户端又告诉服务器它支持br压缩格式,这时服务器端将发送abc.js.br给客户端。客户端不支持brotli,但是支持gzip,这时服务器端将发送abc.js.gz, 如果br与gz都不支持,那服务器就直接发送abc.js了。gz与br是静态文件的压缩格式,对于js与css能够显著减小体积,br尤其明显,减小体积就意味着提高页面响应速度,降低能耗,提升用户体验。如何准备gz与br压缩文件呢?可以用gzipper这类命令行工具,作为发布前的最后的一个环节,一个命令自动在public文件夹下自动生成配套的.gz/.br文件。

  3. 不要被tower吓到,tower是axum的基石,一个团队的作品。学习axum是需要花时间把tower/tower-http捋清楚的,不然你不清楚中间件如何写。tower其实没多复杂,就是一个Service Trait。tower是通用的,与http无关,而tower-http无非是用tower框架写的专门用于http的一套中间件。

  4. Svelte语法更像纯HTML+js+css, 比较平易近人,svelte+axum也是妥妥的。Svelte劣势是项目做大了以后代码重用性差一些,html部分需要多次复制/粘贴,不能做成重复调用的函数。

  5. Solidjs语法与Reactjs一脉相承,一切都是函数,原来用Reactjs做的项目很容易移植到Solidjs。Solidjs写前端就一个字:爽!

  6. 不管是Svelte还是Solidjs做前端,项目要做大,前端代码都推荐用Typescript来写,目前这两个框架在TS支持方面做得都不错。

  7. 不管是Svelte还是Solidjs做前端, css方面还需要搭配一个框架,bulma是一个不错的选择。你不需要在页面设计方面花太多的心思,大师级的页面外观已经妥妥的了。而且,桌面与手机一个页面全搞定!

  8. 个人观点:在Solidjs面前,Angular、React 和 Vue都成了明日黄花,性能、易用性、发布简便性等各项指标都不及Solidjs。

  9. localStorage是html5标准,是前端本地数据存储机制,易用性比cookie更简单,不需要在前端与后台之间来回传送,非常适合单页面应用状态储存,对于配置数据可以永久保存,电脑重启后仍然有效。使用localStorage编程,就两个函数:用getItem读取数据,用setItem保存数据。对于敏感数据,就不要调用setItem函数,保存到本地硬盘中了,一般只保存在内存,浏览器页面关闭,数据就抹掉了。cookie是为多页面应用设计的,相当于Form中的一个隐藏项目,需要服务器端配套代码支持。用Svelte与Solidjs做前端,可以丢掉Cookie了。

作者 eweca-d 2022-03-27 21:49

我去年想写的时候直接手撸的http和html,貌似就是大佬推荐的warp + svelte?哈哈,感谢。登陆处理在客户端确实好像是现在比较流行的做法?我之前登陆B站好像是跳转到“/login”,这是我为什么这么做的原因,现在点进去看了下好像是跳出一个登录框了?好是好,但是我不是专职做软件开发的,后端还行,前端单页面JS我也还可以搞搞,就是复杂度稍微有点高,可能会写的比较dirty,但配套用的这个难度的CSS开发我实在hold不住。

axum我一直想尝试,但是静态文件服务试了一个小时都没成功。。。(example里有相关的例子,但直接调的tower-http,其他的不提,这个属实易用性或者说一致性不强啊)。再加上有之前写warp成功的例子,所以这次也就没改了。solidjs我观望下,其实下一个我想有机会的话用vue.js的。svelte已经够冷门的了,solidjs我怕我出问题都找不到资料可以查。

最后感谢大佬的指点!如果抽出时间,我想我可以系统学学CSS,我现在属于现用现查的地步哈哈。

PS:localStorage相比cookie有什么好处么?感觉手动管理token好像不如用cookie自动发送来的方便啊。

--
👇
c5soft: 初步看了一下,似乎系统整体框架设计有问题。用Svelte写网站,登录处理重点在客户端,需要javascript/typescript比较深厚的功底。整个客户端建议做成单页应用(SPA),用户的登录状态可以通过localStorage来保存。rust端只做两件事,一个是前端ajax的api后端,访问底层数据库,另外一个就是静态文件服务,静态文件服务目录指向Svelte编译目的文件夹。

warp+svelte是我以前推荐给大家的框架搭配,现在不推荐了,有更好的选择。

后端更好框架是axum, tokio团队打造,性能与稳定性与warp相当,易用性明细比warp强。 前端我推荐solidjs, 与svelete原理相同,发布的是编译后的完整程序,不需要带一堆依赖库。solidjs性能比svelte更好,代码重用行比svelte更强。svelte的卖点是易用性,solidjs的卖点是代码重用性。程序规模越大,solidjs的优势就更大。我以前用svelte+warp写的应用,现在都移植到solidjs+axum了。

c5soft 2022-03-27 20:32

初步看了一下,似乎系统整体框架设计有问题。用Svelte写网站,登录处理重点在客户端,需要javascript/typescript比较深厚的功底。整个客户端建议做成单页应用(SPA),用户的登录状态可以通过localStorage来保存。rust端只做两件事,一个是前端ajax的api后端,访问底层数据库,另外一个就是静态文件服务,静态文件服务目录指向Svelte编译目的文件夹。

warp+svelte是我以前推荐给大家的框架搭配,现在不推荐了,有更好的选择。

后端更好框架是axum, tokio团队打造,性能与稳定性与warp相当,易用性明细比warp强。 前端我推荐solidjs, 与svelete原理相同,发布的是编译后的完整程序,不需要带一堆依赖库。solidjs性能比svelte更好,代码重用行比svelte更强。svelte的卖点是易用性,solidjs的卖点是代码重用性。程序规模越大,solidjs的优势就更大。我以前用svelte+warp写的应用,现在都移植到solidjs+axum了。

1 共 5 条评论, 1 页