Как обслуживать два статических сайта с джином в Голанге? - PullRequest
3 голосов
/ 25 апреля 2019

Я хочу создать приложение, которое будет вызывать булеву функцию и в зависимости от результата предоставлять 1 из 2 скомпилированных реагирующих приложений в качестве статических сайтов.

Я использую функцию LoadHTMLGlob, рекомендованную джином, и она работаетхорошо с .tmpl файлами, как пример в их документах.Однако при выполнении только статического html со статическим каталогом для каждого сайта ничего не получается.

Структура файла:

├── main.go
└── sites
    ├── new
    │   ├── index.html
    │   └── static
    └── old
        ├── index.html
        └── static

Go Code:

func main() {
    r := gin.Default()
    //r.LoadHTMLFiles("sites/old/index.html", "sites/new/index.html") //doesn't complain, but can't load html
    r.LoadHTMLGlob("sites/**/*") // complains about /static being a dir on boot
    r.GET("/sites/lib", func(c *gin.Context) {
        id := c.Query("id")
        useNewSite, err := isBetaUser(id)
        if err != nil {
            c.AbortWithStatusJSON(500, err.Error())
            return
        }
        if useNewSite {
            c.HTML(http.StatusOK, "new/index.html", nil)
        } else {
            c.HTML(http.StatusOK, "old/index.html", nil)
        }
    })
    routerErr := r.Run(":8080")
    if routerErr != nil {
        panic(routerErr.Error())
    }
}

Iожидайте, что когда isBetaUser вернётся как истина, он должен загрузить статический контент под сайтами / новый, в противном случае загрузить сайты / старый.

Однако загрузка глобусов приводит к: panic: read sites/new/static: is a directory при запуске паники.

ЗагрузкаHTML-файлы по отдельности (закомментировано выше). Работает нормально, но когда приходит запрос, он паникует с помощью:

html/template: "new/index.html" is undefined

У меня также есть строка с использованием sites / [old || new] /index.html в c.HTML

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Попробуйте sites/**/*.html исправить панику.

И обратите внимание, что Go использует имя файла шаблона base в качестве имени шаблона, поэтому для выполнения шаблона вы используете не "path/to/template.html", а "template.html". Это, конечно, вызывает проблему в вашем случае, поскольку, как объяснено в документации :

При разборе нескольких файлов с одинаковыми именами в разных каталоги, последним упомянутым будет тот, который приводит.

Чтобы исправить это, вам нужно явно назвать ваши шаблоны, что вы можете сделать с помощью действия {{ define "template_name" }}.

  1. Открыто sites/new/index.html
  2. Добавить {{ define "new/index.html" }} в качестве первой строки
  3. Добавьте {{ end }} в качестве последней строки
  4. Повторите для sites/old/index.html с "old/index.html" в качестве имени.
0 голосов
/ 25 апреля 2019

Сначала нужно определить шаблон в файлах шаблонов, будь то файл html / tmpl. Как то так,

{{ define "new/index.tmpl" }} ... {{ end }}

или если вы хотите придерживаться HTML-файла, то это будет

{{ define "new/index.html" }} ... {{ end }}.

Таким образом, ваш файл шаблона (из вашего примера: sites/new/index.html) должен выглядеть следующим образом:

{{ define "new/index.html" }}
  <html>
     <h1>
         {{ .title }}
     </h1>
     <p>New site</p>
   </html>
{{ end }}
...