Как обслуживать два статических сайта с джином в голанге?

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

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

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

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

Код перехода:

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())
    }
}

Я ожидаю, что когда isBetaUser возвращается как true, он должен загружать статический контент в разделы sites/new, в противном случае загружать сайты/old.

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

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

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

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


person Jbar    schedule 25.04.2019    source источник
comment
Попробуйте использовать относительный путь к вашим html файлам (начиная с ./). Например, ./sites/new/index.html.   -  person Дмитро Янковськ&    schedule 25.04.2019
comment
Тот же результат к сожалению   -  person Jbar    schedule 25.04.2019
comment
Вы определили свои html-страницы? Посмотрите на пример с tmpl github.com/gin-gonic /gin/blob/master/README.md#html-рендеринг   -  person Дмитро Янковськ&    schedule 25.04.2019
comment
Поскольку вас интересуют только HTML-файлы, попробуйте LoadHTMLGlob("sites/**/*.html").   -  person Peter    schedule 25.04.2019


Ответы (2)


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

Обратите внимание, что Go использует базовое имя файла шаблона в качестве имени шаблона, поэтому для выполнения шаблона вы используете не "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" в качестве имени.
person mkopriva    schedule 25.04.2019
comment
Отлично, это решило, что html не возвращается, однако теперь я сталкиваюсь с проблемой получения 404, когда static/mystylesheet.app.css И оба сайта имеют свои собственные статические каталоги для обслуживания. - person Jbar; 25.04.2019
comment
Это то, чего я надеялся избежать, поскольку мне нужно изменить, какая статическая папка обслуживается, а также html. Каталог r.StaticX не может быть изменен в зависимости от результата isBetaUser - person Jbar; 25.04.2019
comment
@Jbar использует аргумент obj c.HTML для передачи любого динамического данные, такие как gin.H{"dir": dir}, где переменная dir содержит "new" или "old". Затем обновите свои шаблоны, чтобы они ссылались на статические файлы с помощью каталога dir. например <link rel="stylesheet" href="{{ .dir }}/static/mystylesheet.app.css">. - person mkopriva; 25.04.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 }}
person monirz    schedule 25.04.2019