Django


Django는 flosch에 의해 만들어진 템플릿 엔진으로, 원래 구문 문서를 보려면 여기를 클릭하세요.

Basic Example

./views/index.django


<div data-gb-custom-block data-tag="include" data-0='partials/header.django'></div>

<h1>{{ Title }}</h1>

<div data-gb-custom-block data-tag="include" data-0='partials/footer.django'></div>

./views/partials/header.django

<h2>Header</h2>

./views/partials/footer.django

<h2>Footer</h2>

./views/layouts/main.django

<!DOCTYPE html>
<html>

<head>
  <title>Main</title>
</head>

<body>
  {{embed}}
</body>

</html>
package main

import (
	"log"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/template/django/v3"
)

func main() {
	// 새로운 엔진 생성
	engine := django.New("./views", ".django")

	// 또는 내장된 시스템에서 
	// 예제는 github.com/gofiber/embed 참조
	// engine := html.NewFileSystem(http.Dir("./views", ".django"))

	// 엔진을 Views에 전달
	app := fiber.New(fiber.Config{
		Views: engine,
	})

	app.Get("/", func(c *fiber.Ctx) error {
		// index 렌더링  
		return c.Render("index", fiber.Map{
			"Title": "Hello, World!",
		})
	})

	app.Get("/layout", func(c *fiber.Ctx) error {
		// layouts/main 내부에 index 렌더링
		return c.Render("index", fiber.Map{
			"Title": "Hello, World!",
		}, "layouts/main")
	})

	log.Fatal(app.Listen(":3000"))
}

Using embedded file system (1.16+ only)

// go:embed 지시문을 사용할 때, django의 `

키워드를 사용한 상속된 템플릿의 해석은django.NewFileSystem()을 사용하여 템플릿 엔진을 인스턴스화할 때 실패합니다. 이 경우, 템플릿 엔진을 인스턴스화하기 위해 django.NewPathForwardingFileSystem()` 함수를 사용하세요.

이 함수는 상속된 템플릿을 해석하기 위한 적절한 구성을 제공합니다.

다음과 같은 파일이 있다고 가정해 보겠습니다:

그러면

package main

import (
	"log"
	"embed"
	"net/http"

	"github.com/gofiber/fiber/v2" 
	"github.com/gofiber/template/django/v3"
)

//go:embed views
var viewsAsssets embed.FS

func main() {
	// 새로운 엔진 생성
	engine := NewPathForwardingFileSystem(http.FS(viewsAsssets), "/views", ".django")

	// 엔진을 Views에 전달
	app := fiber.New(fiber.Config{
		Views: engine,
	})

	app.Get("/", func(c *fiber.Ctx) error {
		// descendant 렌더링
		return c.Render("descendant", fiber.Map{
			"greeting": "World",  
		})
	})

	log.Fatal(app.Listen(":3000"))
}

Register and use custom functions

// 내 커스텀 함수 
func Nl2brHtml(value interface{}) string {
	if str, ok := value.(string); ok {
		return strings.Replace(str, "\n", "<br />", -1)
	}
	return ""
}

// 새로운 엔진 생성
engine := django.New("./views", ".django")

// 함수 등록
engine.AddFunc("nl2br", Nl2brHtml)

// 엔진을 Views에 전달
app := fiber.New(fiber.Config{Views: engine})

핸들러에서

c.Render("index", fiber.Map{
    "Fiber": "Hello, World!\n\nGreetings from Fiber Team",
})

./views/index.django

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"></head>
<body>
{{ nl2br(Fiber) }}
</body>
</html>

결과:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"></head>
<body>
Hello, World!<br /><br />Greetings from Fiber Team
</body>
</html>

Template Data Binding에 대한 중요 정보

Pongo2와 이 템플릿 엔진으로 작업할 때는 데이터 바인딩을 위한 특정 규칙을 이해하는 것이 중요합니다. 다음 정규식과 일치하는 키만 지원됩니다: ^[a-zA-Z0-9_]+$.

이는 my-key 또는 my.key와 같은 특수 문자나 구두점이 포함된 키가 호환되지 않으며 템플릿에 바인딩되지 않음을 의미합니다. 이는 Pongo2 템플릿 엔진에 의해 부과된 제약사항입니다. 바인딩 문제를 피하기 위해 키가 이러한 규칙을 준수하는지 확인하세요.

템플릿에서 Pongo2 템플릿 엔진이 부과한 키 이름 지정 제한에 부합하지 않는 값에 액세스해야 하는 경우, fiber.Render를 호출할 때 해당 값을 새 필드에 바인딩할 수 있습니다. 예제는 다음과 같습니다:

c.Render("index", fiber.Map{
    "Fiber": "Hello, World!\n\nGreetings from Fiber Team",
    "MyKey": c.Locals("my-key"),  
})

AutoEscape는 기본적으로 활성화됩니다

Engine의 새 인스턴스를 만들면 auto-escape가 기본적으로 활성화됩니다. 이 설정은 출력을 자동으로 이스케이프 처리하여 Cross-Site Scripting(XSS) 공격에 대한 중요한 보안 조치를 제공합니다.

Auto-Escape 비활성화

필요한 경우 SetAutoEscape 메서드를 사용하여 auto-escape를 비활성화할 수 있습니다:

engine := django.New("./views", ".django")
engine.SetAutoEscape(false)

Django 내장 템플릿 태그를 사용하여 AutoEscape 설정

  • 섹션에 대해 auto-escape를 명시적으로 끄기:

  • 섹션에 대해 auto-escape를 다시 켜기:

  • 내장된 safe를 사용하여 변수별로 수행할 수도 있습니다:

<h1>{{ someSafeVar | safe }}</h1>
{{ "<script>" | safe }}  

Auto-Escape를 비활성화하는 것의 보안 영향

Auto-escape를 비활성화할 때는 주의해야 합니다. 악성 스크립트가 웹 페이지에 삽입되는 XSS 공격에 애플리케이션이 노출될 수 있습니다. Auto-escape가 없으면 사용자가 제공한 데이터로부터 유해한 HTML 또는 JavaScript가 렌더링될 위험이 있습니다.

비활성화할 만한 강력한 이유가 없다면 auto-escape를 활성화해 두는 것이 좋습니다. 비활성화하는 경우, XSS 취약점을 방지하기 위해 사용자가 제공한 모든 콘텐츠를 철저히 살균하고 검증해야 합니다.

Last updated