サイトのトップへ戻る

Google App Engine ドキュメント日本語訳

フォームを処理する

ユーザーがあいさつ文を投稿できるようにしたい場合は、ユーザーによってウェブフォームから送信された情報を処理するロジックが必要です。 Go http packageを使うとフォームのデータの処理が簡単になります。



ウェブフォームを処理する

myapp/hello.goの中身を以下のように書き換えます:

hello.go
View on GitHub
package hello

import (
    "fmt"
    "html/template"
    "net/http"
)

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

func root(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, guestbookForm)
}

const guestbookForm = `
<html>
  <body>
    <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>
  </body>
</html>
`

func sign(w http.ResponseWriter, r *http.Request) {
    err := signTemplate.Execute(w, r.FormValue("content"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

var signTemplate = template.Must(template.New("sign").Parse(signTemplateHTML))

const signTemplateHTML = `
<html>
  <body>
    <p>You wrote:</p>
    <pre>{{.}}</pre>
  </body>
</html>
`

ページを再読み込みしてフォームを表示し、メッセージを送信してください。

今回のバージョンでは二つのハンドラを持っています: パス /rootに紐付けられ、ウェブフォームを表示します。 パス/signsignに紐付けられ、ウェブフォームによって送信されたデータを表示します。

sign 関数ではr.FormValueを呼び出してフォームデータを取得し、それを signTemplate.Executeに引数として渡し、 描写されたフォームをhttp.ResponseWriterへ記述します。 このテンプレートコードでは、コンテンツは自動的にフィルタされ、HTML特殊文字はエスケープ処理されます。 この自動エスケープ処理は、text/templateと違いhtml/template packageのプロパティです。

このチュートリアルの目的のために、テンプレートは固定文字列として一つのソースファイルに埋め込まれます。 より実践的な例については、このgithubリポジトリで、 起動時に一度だけ読み込まれるテンプレートファイルが通常どのように分割保存されているかを参考にしてください。



次は…

ユーザーからの情報を収集できるようになったので、それを保存する場所と保存した情報を取得するロジックが必要です。

データストアを使用する >>