通过 shadynasty.biz/blog/2012/07/30/quick-and-clean-in-go 链接,我正在尝试在 go 编程中创建模板。我的项目结构是使用 Go-SDK 谷歌应用引擎创建的。google_appengine/myapp/hello/hello.go 文件存在,那么在哪里创建模板文件夹?我在“hello”文件夹中创建了“template”文件夹,但出现错误“panic:打开模板/base.html:系统找不到指定的路径”并且服务器停止运行。可以做什么?
3 回答
实际上,您确实可以访问您放入应用程序文件夹的几乎所有文件。
您可以使用 ioutil 来读取文件: http ://golang.org/pkg/io/ioutil/#ReadFile
还有一点需要注意,你只能读取 app.yaml 中静态处理程序未指定的文件。
因此,将模板文件保存在一个文件夹中,将静态和直接提供的文件保存在另一个文件夹中。
仅当您从字段传递 html 时,才可以在 appengine 上使用模板,因为 appengine 规则您无权访问文件系统
这是一个例子
const loginTemplateHTML = `<html>
<body>
<form action="/login" method="post">
<div><input name="username" type="text" /></div>
<div><input name="password" type="password" /></div>
<div><input type="submit" value="login"></div>
</form>
</body>
</html>
`
var loginTemplate = template.Must(template.New("Login").Parse(loginTemplateHTML))
func login (w http.ResponseWriter, r *http.Request) {
if err := loginTemplate.Execute(w,nil); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
问题是应用引擎不会像 go run hello.go 那样调用您的应用程序。它从根目录调用 go run google_appengine/myapp/hello/hello.go。您有两种解决方案来解决此问题。
- 重新定义要从根目录调用的路径。
我推荐和验证的作品只是设置添加从项目根目录到模板文件夹的路径。例如,如果项目的根目录是 myRepo/,而 webapp 的路径是 /myRepo/webapp/hello.go,那么模板现在位于 webapp/templates/index.html 而不是 templates/index.html。为了调用它类似于应用程序引擎,您将从根目录调用它。去运行 webapp/main.go。
- 在 app.yaml 中定义一个自定义入口点。
我尚未验证此解决方案,但我认为它会起作用。在 app.yaml 中有一个 entrypoint 命令是用来启动代码的命令。
入口点: cd myRepo/webapp/ && go run main.go
这是 app.yaml 的文档。确保为您的静态目录添加 url。
https://cloud.google.com/appengine/docs/standard/go/config/appref