Heim > Backend-Entwicklung > Golang > Die Gin-Webanwendung rendert nur eine Vorlage

Die Gin-Webanwendung rendert nur eine Vorlage

WBOY
Freigeben: 2024-02-13 11:30:15
nach vorne
936 Leute haben es durchsucht

Gin Web 应用程序仅渲染一个模板

Gin ist ein leichtes Web-Framework, das häufig in der Webentwicklung in der Go-Sprache verwendet wird. In Gin müssen Webanwendungen normalerweise nur eine Vorlage rendern, um die Seitenanzeige abzuschließen. Dieses Design ermöglicht es Entwicklern, sich stärker auf die Implementierung der Geschäftslogik zu konzentrieren und vereinfacht den Entwicklungsprozess. Nach Ansicht des PHP-Redakteurs Xiaoxin verbessert diese Funktion von Gin nicht nur die Entwicklungseffizienz, sondern reduziert auch den Ressourcenverbrauch, wodurch Webanwendungen effizienter werden. Gleichzeitig bietet Gin auch eine Fülle von Middleware und Plug-Ins, die Entwicklern mehr Skalierbarkeit und Flexibilität bieten. Kurz gesagt: Gins Einfachheit und leistungsstarke Funktionen machen es für viele Entwickler zum bevorzugten Framework.

Frageninhalt

Ich habe eine Gin-Webanwendung, die mehrere HTML-Vorlagen enthält, die auf einer Reihe von Abschnitten und einer Basisvorlage basieren. Die Basisvorlage scheint mit den relevanten Teilen gut gerendert zu werden, aber meine Hauptansicht, mein Login, mein Index und meine Registrierung werden nicht wie erwartet gerendert. Immer wenn ich auf den HTTP-Endpunkt eines dieser Elemente zugreife, wird nur die Registeransicht gerendert.

Fehlender oder falsch konfigurierter Inhalt in den folgenden Dateien führt dazu, dass meine Route die angeforderte Seite nicht rendern kann?

Mein Projekt hat folgenden Aufbau.

├── app
...
│   ├── handlers
│   │   ├── general
│   │   │   └── general.go
│   │   └── routes.go
│   ├── main.go
│   ├── reloadDev.sh
│   ├── static
│   │   ├── css
│   │   ├── img
│   │   └── js
│   └── templates
│       ├── home
│       │   ├── index.tmpl.html
│       │   ├── login.tmpl.html
│       │   └── register.tmpl.html
│       ├── layouts
│       │   └── base.tmpl.html
│       └── partials
│           ├── footer.tmpl.html
│           ├── head.tmpl.html
│           └── navbar.tmpl.html
Nach dem Login kopieren

base.tmpl.html

{{ define "base" }}
<!DOCTYPE html>
<html lang="eng" data-bs-theme="dark">
    {{ template "head" . }}
    {{template "navbar" .}}
    <body>
    {{ block "content" . }}{{ end }}
    </body>
    {{template "footer" .}}
</html>
{{end}}
Nach dem Login kopieren

Registration.tmpl.html

{{ template "base" . }}
{{ define "content" }}
<div class="container">
    <div class="row">
        <div class="col-md-6 offset-md-3">
            <h1>Register</h1>
            <form action="/register" method="post">
                <div class="mb-3">
                    <label for="username" class="form-label">Username</label>
                    <input type="text" name="username" id="username" class="form-control" placeholder="Username" required>
                </div>
                <div class="mb-3">
                    <label for="password" class="form-label">Password</label>
                    <input type="password" name="password" id="password" class="form-control" placeholder="Password" required>
                </div>
...SNIP...
                <button type="submit" class="btn btn-primary">Register</button>
            </form>
        </div>
    </div>
</div>
{{ end }}
Nach dem Login kopieren

index.tmpl.html (Die Anmeldestruktur ist die gleiche wie bei diesen beiden.)

{{ template "base" . }}
{{ define "title" }}Home{{ end }}
{{ define "content" }}
<div class="container">
    <div class="row">
        <div class="col-md-6 offset-md-3">
            <p>Welcome to Astra Porta.</p>
            <p>Click <a href="https://www.php.cn/link/1b8e84dcae97ad25234484e38615c570">here</a> to login.</p>
        </div>
    </div>
</div>
{{ end }}
Nach dem Login kopieren

HTML-Vorlagen werden mithilfe von embed.FS mit Binärdateien gebündelt.

//go:embed templates/partials/* templates/layouts/* templates/home/*
var files embed.FS

func main() {
    router := setupRouter()
    err := router.Run()
    if err != nil {
        panic(err)
    }
}

func setupRouter() *gin.Engine {
    router := gin.Default()
    subFS, e := fs.Sub(files, "templates")
    if e != nil {
        panic(e)
    }

tmpl := template.Must(template.ParseFS(
    subFS,
    "layouts/*.html",
    "partials/*.html",
    "home/*.html",
))
router.SetHTMLTemplate(tmpl)

router.StaticFS("/static", http.Dir("static"))

err := router.SetTrustedProxies(nil)
if err != nil {
    panic(err)
}
handlers.InitializeRoutes(&router.RouterGroup)
return router
}
Nach dem Login kopieren

Die Seite wird in meiner Bewerbungsroute gerendert. Verweise hier beziehen sich auf den Dateinamen der *.tmpl.html-Datei.

func SiteIndex(c *gin.Context) {
    c.HTML(http.StatusOK, "index.tmpl.html", nil)
}

func GetRegister(c *gin.Context) {
    c.HTML(http.StatusOK, "register.tmpl.html", nil)
}

func GetLogin(c *gin.Context) {
    c.HTML(http.StatusOK, "login.tmpl.html", nil)
}
Nach dem Login kopieren

Workaround

Für alle anderen, die auf dieses Problem stoßen. Die von mkopriva im Kommentar aufgezeigte Lösung ist korrekt. Ich habe das base.tmpl.html entfernt und jede Ansicht mit dem aktualisierten Abschnitt und der Zielseite zusammengestellt.

Titel

{{ define "header" }}
<!DOCTYPE html>
<html lang="eng" data-bs-theme="dark">
{{template "navbar" .}}
    <body>
    {{ block "content" . }}{{ end }}
        <head><meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
           ...SNIP...
            <title>App</title>
        </head>
{{end}}
Nach dem Login kopieren

Fußzeile

{{define "footer"}}

        <div class="container">
            <footer class="py-3 my-4" data-bs-theme="dark">
                <ul class="nav justify-content-center border-bottom pb-3 mb-3">
                    <li class="nav-item"><a href="/" class="nav-link px-2 text-body-secondary">Home</a></li>
                </ul>
                <p class="text-center text-body-secondary">© 2024 .</p>
            </footer>
        </div>
    </body>
</html>
{{end}}
Nach dem Login kopieren

Problematische Seite

{{template "header"}}
<div class="container">
    <div class="row">
        <div class="col-md-6 offset-md-3">
            <p>Welcome to Astra Porta.</p>
            <p>Click <a href="https://www.php.cn/link/1b8e84dcae97ad25234484e38615c570">here</a> to login.</p>
        </div>
    </div>
</div>
{{template "footer"}}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDie Gin-Webanwendung rendert nur eine Vorlage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage