我正在嘗試使用 Rust Rocket 框架作為託管我的網站的後端,但我正在努力提供基本的 HTML 文件及其關聯文件。
就事情而言,這是我的「網站」的程式碼。我真的不確定如何做到這一點,作為後端開發的新手,我想我會看看這裡是否有答案。
#[macro_use] extern crate rocket; use std::fs::File; use rocket::{response::{Redirect}, fs::FileServer}; #[get("/")] fn index() -> Redirect { let redirect = Redirect::to(uri!("/home")); redirect } #[launch] fn rocket() -> _ { rocket::build().mount("/", routes![index]) }
我不確定建立前端檔案的最佳方法是什麼。任何建議/幫助表示讚賞。請對我寬容一些,因為我在後端開發方面缺乏經驗。
我已經嘗試了 GitHub 上列出的靜態範例,但是,我認為遇到了問題:我可以查看 HTML 頁面,但圖像、CSS 和 JavaScript 檔案無法正確提供。
P粉3774120962024-03-28 00:25:34
我想出了一個更簡單的解決方案。您可以簡單地使用 FileServer
來託管您的靜態文件,如下所示:
#[launch] fn rocket() -> _ { rocket::build() .mount("/", routes![index]) .mount("/css", FileServer::from(relative!("/templates/css"))) .mount("/js", FileServer::from(relative!("/templates/js"))) .mount("/fonts", FileServer::from(relative!("/templates/fonts"))) .mount("/img", FileServer::from(relative!("/templates/img"))) .attach(Template::fairing()) }
因此,每當我的 HTML 模板嘗試呼叫 CSS 檔案時,Rocket 都會從 /templates/css
目錄提供 CSS 檔案。
P粉7647859242024-03-28 00:15:22
這是最適合我的程式碼。我想為那些可能正在努力進入後端 Web 開發(尤其是 Rust)的人解釋一下這一點。
#[macro_use] extern crate rocket; use rocket::{fs::NamedFile, response::Redirect}; use std::path::{Path, PathBuf}; #[get("/")] fn index() -> Redirect { let redirect = Redirect::to(uri!("/home")); redirect } #[get("/home")] async fn home () -> Option{ NamedFile::open("client/index.html").await.ok() } #[get("/ ")] async fn files(file: PathBuf) -> Option { NamedFile::open(Path::new("client").join(file)).await.ok() } #[launch] fn rocket() -> _ { rocket::build().mount("/", routes![index, home, files]) }
我將從第一部分開始。
#[macro_use] extern crate rocket; use rocket::{fs::NamedFile, response::Redirect}; use std::path::{Path, PathBuf};
^ 這只是我們對我需要使用的內容的聲明。
#[get("/")] fn index() -> Redirect { let redirect = Redirect::to(uri!("/home")); redirect } #[get("/home")] async fn home () -> Option{ NamedFile::open("client/index.html").await.ok() }
^ 此部分用於重定向空白索引 URL,以不給出 404,並轉到末尾帶有“/home”的 URL。這只是我個人的喜好,但現在你也知道怎麼做了!
最後,我透過查看 NamedFile 的 Rust 分析器範例來確定如何具體開啟不同的檔案。
#[get("/")] async fn files(file: PathBuf) -> Option { NamedFile::open(Path::new("client").join(file)).await.ok() }
^ 此部分用於處理其他文件,例如 HTML 文件中連結的 CSS 和 JavaScript。我想這不是一個非常安全的方法,但對於投資組合網站來說,我不需要非常強大的安全性。
#[launch] fn rocket() -> _ { rocket::build().mount("/", routes![index, home, files]) }
^ 最後,您只需安裝路線即可。這樣做似乎對我有用。我相信更聰明、更有經驗的人可以用比我更優雅的方式解釋它,但如果你像我一樣處於緊要關頭,並且你無計可施,希望這是一個急需的救生圈當你溺水時。