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

Die Gin-Webanwendung rendert nur eine Vorlage

WBOY
WBOYnach vorne
2024-02-13 11:30:15944Durchsuche

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

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

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

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

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
}

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

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

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

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"}}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen