sipin/gorazor

请教gorazor模板几个基本问题: 网页的错误页面

smithfox opened this issue · 4 comments

一般网站在发生内部错误的时候会统一跳转到一个错误页面。所以会有一个统一的入口和实现。用 go native template 实现的伪代码:
basepage.go

  package base
  func Error(errcode int, errmsg string) {
        data.User = currentUser
        data.HasNewMessage = false
        data.SomeOtherBussinesData = xxx
        gotemplate.Render("error.tpl", data)
  }

这个思路在很多模板系统是流行的解决方法,能统一处理所有页面处理时出错 渲染 Error Page

用gorazor按这个思路做不了,比如伪代码类似
gorazor_basepage.go

  package base
  import "gorazor_gentpl"

  func Error(errcode int, errmsg string) {
        data.User = currentUser
        data.HasNewMessage = false
        data.SomeOtherBussinesData = xxx
        gorazor_gentpl.Error(data)
  }

gorazor_gentpl 这里面的代码有 import 了 base 里的不少东西。

问题的本质: go native tempate 非代码运行,虽然tpl引用了base,但 base 内再 call tpl 没问题。但gorazor是代码运行就有package 相互 import 的问题。

我能想到的解决方法:

  1. 将 Error 做的很简单,不用 模板系统。 这种改动有点本末倒置,让用户体验服从框架。
  2. 将 Error 的模板引用到的东西再抽成一个 package,base 也 import 这个package
    这个思路貌似可行,但是 package 是目录级别的,得要考虑同目录下go文件的 import,牵扯有点多,而且这会导致后面很多代码都提心吊胆。

不知道 gorazor 如何解决这个问题的

我有点好奇为什么你是以错误页面为例来问这个issue。

如果项目中有相互import的情况,系统正常页面会不是更容易出现这情况嘛?

如果正常页面不存在相互import,那为什么错误页面会?

正常页面 和 错误页面 的区别是:
错误页面 是放在了框架层。而 tpl 严重依赖框架层

你们在实际项目中如何处理错误的, 想借鉴借鉴

tpl "tpl/error"

func errorPage(ctx *web.Context, status int, args interface{}) string {
    if status == 404 {
        return tpl.Error_404(ctx)
    }
    if status == 500 {
        return tpl.Error_500(ctx, cfg.Debug, args)
    }
    return fmt.Sprintf("error %d\n", status)
}

web.SetErrorPageHandler(errorPage)

参考:
https://github.com/sipin/web/blob/master/web.go#L494

error_404.gohtml

@{
    import (
        "tpl/admin/layout/base"
        "github.com/sipin/web"
    )
    var ctx *web.Context
}

<div class="error-container">
    <div class="well">
        <h1 class="grey lighter smaller">
            <span class="blue bigger-125">
                <i class="ace-icon fa fa-sitemap"></i>
                404
            </span>
            页面不存在
        </h1>

        <hr>

        <div>
            <div class="space"></div>
            <h4 class="smaller">相关建议:</h4>

            <ul class="list-unstyled spaced inline bigger-110 margin-15">
                <li>
                    <i class="ace-icon fa fa-hand-o-right blue"></i>
                    检查输入的网址
                </li>

                <li>
                    <i class="ace-icon fa fa-hand-o-right blue"></i>
                    阅读文档
                </li>

                <li>
                    <i class="ace-icon fa fa-hand-o-right blue"></i>
                    联系系统管理员
                </li>
            </ul>
        </div>

        <hr>
        <div class="space"></div>

        <div class="center">
            <a href="javascript:history.back()" class="btn btn-grey">
                <i class="ace-icon fa fa-arrow-left"></i>
                返回
            </a>
        </div>
    </div>
</div>