google-app-engine - 如何在 Golang 中创建和渲染基本模板?

标签 google-app-engine go

如何在 Golang 中创建和渲染基础模板? - 创建登录表单 - 将其保存在 UserLogin 结构中(datastore.put 和 datastore.get)

    type UserLogin struct{
         UserName string
         PassWord string
     }

我是根据来自谷歌的一些文档的示例创建的: 但这是使用 Go-app 中可用的默认用户创建的。 想用 Go 创建 Open Id 登录表单。 如何做到这一点?

package hello

import (
    "appengine"
    "appengine/datastore"   
    "html/template"
    "net/http"       
)    
//AdminData Structure
type AdminData struct {
    UserName  string
    UserPassword string    
}

func init() {
    http.HandleFunc("/", root)  
    http.HandleFunc("/login", login)
}    

func root(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    q := datastore.NewQuery("AdminData").Limit(10)
    adminsdata := make([]AdminData, 0, 10)
    if _, err := q.GetAll(c, &adminsdata); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    if err := loginTemplate.Execute(w, adminsdata); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

var loginTemplate = template.Must(template.New("book").Parse(loginTemplateHTML))

const loginTemplateHTML = `
<html>
  <body>
    {{range .}}
      {{with .UserName}}
        <p><b>{{.}}</b> user name:</p>
      {{else}}
        <p>An anonymous person wrote:</p>
      {{end}}
      <pre>{{.UserPassword}}</b> password:</p></pre>
    {{end}}
    <form action="/login" method="post">     
      <div>User Name : <input type="text" name="userName" value=""> </div>
      <div>Password : <input type="password" name="userPassword" value=""> </div>
      <div><input type="submit" value="Login"></div>
    </form>
  </body>
</html>
`

func login(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    g := AdminData{
        UserName : r.FormValue("userName"),enter code here
        UserPassword : r.FormValue("userPassword"),
    }

    _, err := datastore.Put(c, datastore.NewIncompleteKey(c, "AdminData", nil), &g)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    http.Redirect(w, r, "/", http.StatusFound)
}

最佳答案

在你的 google appengine console 中,将 auth 更改为 openid provider 的基本设置

然后添加以下代码,它会检查 appengine 用户是否已登录,如果没有,他将向他显示 google 登录页面。

u := user.Current(c)
if u == nil {
    url, err := user.LoginURL(c, r.URL.String())
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    w.Header().Set("Location", url)
    w.WriteHeader(http.StatusFound)
    return
}

关于google-app-engine - 如何在 Golang 中创建和渲染基本模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17148212/

相关文章:

python - gcloud 应用部署 : This deployment has too many files

xml - 如何在 Go 中解码包含脏 HTML 的 XML

internationalization - 如何在 Go 中处理 i18n?

Go 模板在行之间交替设计

performance - 如果 GOMAXPROCS 太大怎么办?

java - App Engine 搜索 api GeoPoint 搜索

java - 如何从 Google App Engine 应用程序运行 Google Dataflow 管道?

java - GAE 抛出堆溢出错误之前的最大对象大小是多少

google-app-engine - 一个谷歌应用引擎应用程序如何服务于多个域?

go - 如何使用 REST API 将消息正确发布到简单的 Go Chatserver