はじめてGAE,GOをさわってみてます。
こちら
を参考にしました。参考先のまんまコピーですが、以下のような2つのファイルを作成しデプロイしたところエラーになりました。
app.yaml
yaml
1application: point-viewer-335223 2version: 1 3runtime: go 4api_version: go1 5 6# ルートのみ認証不要 7handlers: 8- url: / 9 script: _go_app 10- url: /.* 11 script: _go_app 12 login: required 13 auth_fail_action: redirect
main.go
Go
1// 2// 会員向け点数告知(サンプル版) 3// 4package main 5 6import ( 7 "fmt" 8 "net/http" 9 "strconv" 10 11 "google.golang.org/appengine" 12 "google.golang.org/appengine/datastore" 13 "google.golang.org/appengine/user" 14) 15 16// 会員情報 17type UserInfo struct { 18 UserId string // 会員ID 19 Point int // 点数 20} 21 22// 初期化 23func init() { 24 http.HandleFunc("/", rootPage) 25 http.HandleFunc("/admin", adminPage) 26 http.HandleFunc("/entry", entryAction) 27 http.HandleFunc("/viewer", viewerPage) 28} 29 30// ルートページ(/) 31func rootPage(w http.ResponseWriter, r *http.Request) { 32 w.Header().Set("Content-type", "text/html; charset=utf-8") 33 ctx := appengine.NewContext(r) 34 35 u := user.Current(ctx) // ログイン情報 36 var userView string 37 if u == nil { 38 url, _ := user.LoginURL(ctx, "/") // ログインURL 39 userView = fmt.Sprintf("あなたは、ログインしていません。<a href='%s'>ログイン</a>", url) 40 } else { 41 url, _ := user.LogoutURL(ctx, "/") // ログアウトURL 42 userView = fmt.Sprintf("あなたは、%sさんです。<a href='%s'>ログアウト</a>", u.Email, url) 43 } 44 fmt.Fprintf(w, ` 45 <h1>会員向け点数告知(サンプル版)</h1> 46 47会員向けにインターネットから自身の点数を確認させるWebサービスです。 48 49Google(又はG Suite)ユーザ認証機能を利用しています。 50 %s 51 <hr /> 52 53以下のページはログインが必要です。 54 55<a href="/admin">管理者ページ(会員と点数の登録)</a> 56 57<a href="/viewer">会員ページ(点数の照会)</a> 58 `, userView) 59} 60 61// 管理者ページ(/admin) 62func adminPage(w http.ResponseWriter, r *http.Request) { 63 w.Header().Set("Content-type", "text/html; charset=utf-8") 64 //ctx := appengine.NewContext(r) 65 66 fmt.Fprintf(w, ` 67 <h1>管理者ページ</h1> 68 69ここでは管理者が会員と点数の登録を行います。 70 71サンプル版では単純な上書き登録又は削除のみ可能です。 72 本来は管理者以外のアクセスを制限しますが、サンプル版では制限していません。 73 <hr /> 74 <form action="/entry" method="post"> 75 76■会員ID:<input type="input" name="user-id" /> 77 Googleアカウント(又はG Suite)のメールアドレスを入力します。 78 79■点数:<input type="input" name="point" /> 80 点数を数字で入力します。(空欄:会員IDの削除) 81 <button type="submit">登録</button 82 </form> 83 <hr /> 84 85<a href="/">戻る</a> 86 `) 87} 88 89// 登録アクション(/entry) 90func entryAction(w http.ResponseWriter, r *http.Request) { 91 w.Header().Set("Content-type", "text/html; charset=utf-8") 92 ctx := appengine.NewContext(r) 93 94 id := r.FormValue("user-id") // 会員ID 95 if id == "" { 96 http.Error(w, "会員IDが指定されていません。", http.StatusBadRequest) 97 return 98 } 99 key := datastore.NewKey(ctx, "UserInfo", id, 0, nil) // KEY生成 100 pointStr := r.FormValue("point") // 点数 101 // 点数が未設定なら削除する 102 if pointStr == "" { 103 err := datastore.Delete(ctx, key) // 削除 104 if err != nil { 105 http.Error(w, err.Error(), http.StatusInternalServerError) 106 return 107 } 108 fmt.Fprintf(w, ` 109 110%s を削除しました。 111 112<a href="/admin">戻る</a> 113 `, id) 114 return 115 } 116 // 点数が設定されていれば上書登録する 117 point, err := strconv.Atoi(pointStr) //数値変換 118 if err != nil { 119 http.Error(w, "数値変換エラー", http.StatusBadRequest) 120 return 121 } 122 info := UserInfo{UserId: id, Point: point} 123 _, err = datastore.Put(ctx, key, &info) // 上書き登録 124 if err != nil { 125 http.Error(w, err.Error(), http.StatusInternalServerError) 126 return 127 } 128 fmt.Fprintf(w, ` 129 130登録しました。 131 132会員ID: %s 133 点数: %d点 134 135<a href="/admin">戻る</a> 136 `, info.UserId, info.Point) 137} 138 139// 会員ページ(/viewer) 140func viewerPage(w http.ResponseWriter, r *http.Request) { 141 w.Header().Set("Content-type", "text/html; charset=utf-8") 142 ctx := appengine.NewContext(r) 143 144 u := user.Current(ctx) 145 key := datastore.NewKey(ctx, "UserInfo", u.Email, 0, nil) // KEY生成 146 // 点数の参照 147 var info UserInfo 148 err := datastore.Get(ctx, key, &info) // 参照 149 if err != nil { 150 http.Error(w, "あなたは会員登録されていません。", http.StatusNotFound) 151 return 152 } 153 fmt.Fprintf(w, ` 154 <h1>点数の照会</h1> 155 156こんにちは、%sさん 157 158あなたの点数は %d 点です。 159 160<a href="/">戻る</a> 161 `, info.UserId, info.Point) 162}
以下のようにdeployするとエラーになりました。
cmd
1tanxx10@cloudshell:~/point-viewer (point-viewer-335223)$ goapp deploy 2Traceback (most recent call last): 3 File "/google/go_appengine/goapp", line 136, in <module> 4 goroot = GetGoRoot(os.environ['GOPATH'], sys.argv) 5 File "/google/go_appengine/goapp", line 117, in GetGoRoot 6 app_yaml = _ParseAppYaml(app_yaml_path) 7 File "/google/go_appengine/goapp", line 91, in _ParseAppYaml 8 return appinfo_includes.Parse(f) 9 File "/google/go_appengine/google/appengine/api/appinfo_includes.py", line 57, in Parse 10 appyaml, _ = ParseAndReturnIncludePaths(appinfo_file, open_fn) 11 File "/google/go_appengine/google/appengine/api/appinfo_includes.py", line 82, in ParseAndReturnIncludePaths 12 appyaml = appinfo.LoadSingleAppInfo(appinfo_file) 13 File "/google/go_appengine/google/appengine/api/appinfo.py", line 2664, in LoadSingleAppInfo 14 listener.Parse(app_info) 15 File "/google/go_appengine/google/appengine/api/yaml_listener.py", line 242, in Parse 16 stream, loader_class, version=version, **loader_args)) 17 File "/google/go_appengine/google/appengine/api/yaml_listener.py", line 180, in _HandleEvents 18 raise yaml_errors.EventError(e, event_object) 19google.appengine.api.yaml_errors.EventError: Unknown url handler type. 20<URLMap 21 secure=default 22 static_files=None 23 application_readable=None 24 auth_fail_action=redirect 25 require_matching_file=None 26 static_dir=None 27 redirect_http_response_code=None 28 http_headers=None 29 url=/ 30 script=None 31 upload=None 32 api_endpoint=None 33 expiration=None 34 position=None 35 login=optional 36 mime_type=None 37 > 38 in "/home/tanxx10/point-viewer/app.yaml", line 9, column 2
エラーメッセージでググっていますが有効な情報にたどり着かずにいます。
先輩方アドバイス宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。