请教gorazor模板几个基本问题: 网页的错误页面
smithfox opened this issue · 4 comments
smithfox commented
一般网站在发生内部错误的时候会统一跳转到一个错误页面。所以会有一个统一的入口和实现。用 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 的问题。
我能想到的解决方法:
- 将 Error 做的很简单,不用 模板系统。 这种改动有点本末倒置,让用户体验服从框架。
- 将 Error 的模板引用到的东西再抽成一个 package,base 也 import 这个package
这个思路貌似可行,但是 package 是目录级别的,得要考虑同目录下go文件的 import,牵扯有点多,而且这会导致后面很多代码都提心吊胆。
不知道 gorazor 如何解决这个问题的
Wuvist commented
我有点好奇为什么你是以错误页面为例来问这个issue。
如果项目中有相互import的情况,系统正常页面会不是更容易出现这情况嘛?
如果正常页面不存在相互import,那为什么错误页面会?
smithfox commented
正常页面 和 错误页面 的区别是:
错误页面 是放在了框架层。而 tpl 严重依赖框架层
smithfox commented
你们在实际项目中如何处理错误的, 想借鉴借鉴
Wuvist commented
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>