Iris supports 7 template engines out-of-the-box, developers can still use any external golang template engine, as Context.ResponseWriter() is an io.Writer.

All template engines share a common API i.e. Parse using embedded assets, Layouts and Party-specific layout, Template Funcs, Partial Render and more.

List of Examples.

A view engine can be registered per-Party. To register a view engine use the Application/Party.RegisterView(ViewEngine) method as shown below.

Load all templates from the "./views" folder where extension is ".html" and parse them using the standard html/template package.

// [app := iris.New...]
tmpl := iris.HTML("./views", ".html")


To render or execute a view use the Context.View method inside the main route's handler. E.g. to load the ./views/hi.html template file:

ctx.View("hi") // or hi.html

Pass Data

To bind Go values with key-value pattern inside a view through middleware or main handler use the Context.ViewData method before the Context.View one.

Bind: {{.message}} with "Hello world!".

ctx.ViewData("message", "Hello world!")

To bind a Go model to a view you have two options:


ctx.ViewData("user", User{})

// variable binding as {{.user.Name}}


ctx.View("user-page.html", User{})

// root binding as {{.Name}}

To add a template function use the AddFunc method of the preferred view engine.

//       func name, input arguments, render value
tmpl.AddFunc("greet", func(s string) string {
    return "Greetings " + s + "!"

To reload on each request set the view engine's Reload method.



To use embedded templates and not depend on local file system use the go-bindata external tool and pass its Asset and AssetNames functions to the Binary method of the preferred view engine.

tmpl.Binary(Asset, AssetNames)

Example Code:

Please read the comments too.

// file: main.go
package main

import ""

func main() {
    app := iris.New()

    // Parse all templates from the "./views" folder
    // where extension is ".html" and parse them
    // using the standard `html/template` package.
    tmpl := iris.HTML("./views", ".html")

    // Enable re-build on local template files changes.

    // Default template funcs are:
    // - {{ urlpath "myNamedRoute" "pathParameter_ifNeeded" }}
    // - {{ render "header.html" }}
    // and partial relative path to current page:
    // - {{ render_r "header.html" }} 
    // - {{ yield }}
    // - {{ current }}
    // Register a custom template func:
    tmpl.AddFunc("greet", func(s string) string {
        return "Greetings " + s + "!"

    // Register the view engine to the views,
    // this will load the templates.

    // Method:    GET
    // Resource:  http://localhost:8080
    app.Get("/", func(ctx iris.Context) {
        // Bind: {{.message}} with "Hello world!"
        ctx.ViewData("message", "Hello world!")
        // Render template file: ./views/hi.html

<!-- file: ./views/hi.html -->
    <title>Hi Page</title>
    <strong>{{greet "to you"}}</strong>

Open a browser tab at http://localhost:8080.

The rendered result will look like this:

    <title>Hi Page</title>
    <h1>Hello world!</h1>
    <strong>Greetings to you!</strong>


Iris allows unlimited number of registered view engines per Application. Besides that, you can register a view engine per Party or through middleware too!.

// Register a view engine per group of routes.
adminGroup := app.Party("/admin")
adminGroup.RegisterView(iris.Blocks("./views/admin", ".html"))

Through Middleware

func middleware(views iris.ViewEngine) iris.Handler {
	return func(ctx iris.Context) {


// Register a view engine on-fly for the current chain of handlers.
views := iris.Blocks("./views/on-fly", ".html")

app.Get("/", setViews(views), onFly)

Last updated