第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么我的腳本讀取在我的 HTML 中鏈接的文件,而在 GoLang 中使用

為什么我的腳本讀取在我的 HTML 中鏈接的文件,而在 GoLang 中使用

Go
慕碼人8056858 2022-11-23 15:57:44
我有一個(gè) GoLang 腳本,用于根據(jù)瀏覽器中的輸入查詢動(dòng)態(tài)構(gòu)建網(wǎng)頁(yè),如下所示http://localhost:8000/blog/post#,該post#部分用于識(shí)別要解析到我創(chuàng)建的 HTML 模板中的 JSON 數(shù)據(jù)文件;例如,如果我把它從我的文件中http://localhost:8000/blog/post1創(chuàng)建一個(gè)文件。目前,我的腳本在運(yùn)行時(shí)允許我在瀏覽器中加載單個(gè)頁(yè)面,然后它退出并在我的終端標(biāo)準(zhǔn)輸出日志中顯示錯(cuò)誤:index.htmlpost1.json2022/03/18 00:32:02 error: open jsofun.css.json: no such file or directoryexit status 1這是我當(dāng)前的腳本:package mainimport (    "encoding/json"    "html/template"    "io/ioutil"    "log"    "net/http"    "os")func blogHandler(w http.ResponseWriter, r *http.Request) {    blogstr := r.URL.Path[len("/blog/"):]    blogstr = blogstr + ".json"    // read the file in locally    json_file, err := ioutil.ReadFile(blogstr)    if err != nil {        log.Fatal("error: ", err)    }    // define a data structure    type BlogPost struct {        // In order to see these elements later, these fields must be exported        // this means capitalized naming and the json field identified at the end        Title       string `json:"title"`        Timestamp   string `json:"timestamp"`        Main        string `json:"main"`        ContentInfo string `json:"content_info"`    }    // json data    var obj BlogPost    err = json.Unmarshal(json_file, &obj)    if err != nil {        log.Fatal("error: ", err)    }    tmpl, err := template.ParseFiles("./blogtemplate.html")    HTMLfile, err := os.Create("index.html")    if err != nil {        log.Fatal(err)    }    defer HTMLfile.Close()    tmpl.Execute(HTMLfile, obj)    http.ServeFile(w, r, "./index.html")}func main() {    http.HandleFunc("/blog/", blogHandler)    log.Fatal(http.ListenAndServe(":8080", nil))}我已經(jīng)完成了一些基本的調(diào)試,并確定問(wèn)題出在以下幾行:json_file, err := ioutil.ReadFile(blogstr)    if err != nil {        log.Fatal("error: ", err)    }令我困惑的是為什么 ioutil.ReadFile 也試圖讀取我的 HTML 中鏈接的文件?瀏覽器不應(yīng)該處理該鏈接而不是我的處理程序嗎?作為參考,這是我jsofun.css鏈接文件的 HTML;我的控制臺(tái)輸出中引用的錯(cuò)誤顯示我的腳本jsofun.css.json在調(diào)用期間嘗試訪問(wèn)此文件ioutil.ReadFile:
查看完整描述

2 回答

?
繁星coding

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊

您的 Go 服務(wù)器設(shè)置為僅提供/blog/路徑服務(wù),它通過(guò)執(zhí)行blogHandler. 在您的 Go 服務(wù)器中沒(méi)有其他任何東西被設(shè)置為提供諸如 css、js 或圖像文件之類的資產(chǎn)。


對(duì)于這樣的事情,您通常需要FileServer在單獨(dú)的路徑上注冊(cè)一個(gè)單獨(dú)的處理程序。例子:


func main() {

    http.HandleFunc("/blog/", blogHandler)

    // To serve a directory on disk (/path/to/assets/on/my/computer)

    // under an alternate URL path (/assets/), use StripPrefix to

    // modify the request URL's path before the FileServer sees it:

    http.Handle("/assets/", http.StripPrefix("/assets/",

        http.FileServer(http.Dir("/path/to/assets/on/my/computer"))))

    log.Fatal(http.ListenAndServe(":8080", nil))

}

您需要修復(fù)的另一件事是 HTML 中那些資產(chǎn)字段的鏈接,它們應(yīng)該是絕對(duì)的,而不是相對(duì)的。


...

<link rel="stylesheet" href="/assets/jsofun.css"></style>

...

<script src="/assets/jsofun.js">

以上當(dāng)然只有在資產(chǎn)位于/path/to/assets/on/my/computer目錄中時(shí)才有效,例如


/path/to/assets/on/my/computer

├── jsofun.css

└── jsofun.js

您blogHandler不必要地為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新文件而不刪除它,這有可能很快將您的磁盤(pán)填滿到其最大容量。要提供模板,您不需要?jiǎng)?chuàng)建新文件,而是可以直接將模板執(zhí)行到http.ResposeWriter. 還建議只解析一次模板,尤其是在生產(chǎn)代碼中,以避免不必要的資源浪費(fèi):


type BlogPost struct {

    Title       string `json:"title"`

    Timestamp   string `json:"timestamp"`

    Main        string `json:"main"`

    ContentInfo string `json:"content_info"`

}


var blogTemplate = template.Must(template.ParseFiles("./blogtemplate.html"))


func blogHandler(w http.ResponseWriter, r *http.Request) {

    blogstr := r.URL.Path[len("/blog/"):] + ".json"


    f, err := os.Open(blogstr)

    if err != nil {

        http.Error(w, err.Error(), http.StatusNotFound)

        return

    }

    defer f.Close()


    var post BlogPost

    if err := json.NewDecoder(f).Decode(&post); err != nil {

        http.Error(w, err.Error(), http.StatusInternalServerError)

        return

    }

    if err := blogTemplate.Execute(w, post); err != nil {

        log.Println(err)

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-11-23
?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

讓我們研究一下當(dāng)您請(qǐng)求時(shí)會(huì)發(fā)生什么http://localhost:8000/blog/post#。

瀏覽器請(qǐng)求頁(yè)面;您的代碼成功構(gòu)建并返回一些html- 這將包括:

<link rel="stylesheet" href="./jsofun.css"></style>

瀏覽器接收并處理 HTML;作為該過(guò)程的一部分,它要求css上述內(nèi)容?,F(xiàn)在原始請(qǐng)求在文件夾中,/blog/post#因此./jsofun.css變?yōu)?code>http://localhost:8000/blog/jsofun.css.

當(dāng)您的 go 應(yīng)用程序收到此請(qǐng)求blogHandler時(shí)將被調(diào)用(由于請(qǐng)求路徑);它剝離/blog/然后添加.json以獲取文件名jsofun.css.json。然后您嘗試打開(kāi)此文件并收到錯(cuò)誤消息,因?yàn)樗淮嬖凇?/p>

有幾種方法可以解決這個(gè)問(wèn)題;更改要使用的模板<link rel="stylesheet" href="/jsofun.css"></style>可能是一個(gè)開(kāi)始(但我不知道jsofun.css存儲(chǔ)在哪里,并且您沒(méi)有顯示任何可用于該文件的代碼)。我認(rèn)為還值得注意的是,您不必index.html在磁盤(pán)上創(chuàng)建文件(除非有其他原因需要這樣做)。

(請(qǐng)參閱 mkopriva 對(duì)其他問(wèn)題和進(jìn)一步步驟的回答 - 在發(fā)布該答案時(shí)輸入此內(nèi)容已經(jīng)進(jìn)行了一半,并且覺(jué)得演練可能仍然有用)。


查看完整回答
反對(duì) 回復(fù) 2022-11-23
  • 2 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)