-2

index.py のフォームと、guestbook.py によって処理されるデータストア クエリ応答 (ここでは「コメント」) が必要なので、フォーム応答はフォーム送信後に訪問者に表示されるため、2 ページになります。アプリと統合する前に、これをできるだけ簡単に行うために Google のゲストブックを編集しています。データストアは機能していますが、応答が訪問者に返されません (POST 302)。

application: guestbook
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /
  script: index.app
- url: .* 
  script: guestbook.app

libraries:
- name: webapp2
  version: "2.5.1"

index.py

#!/usr/bin/env python
import cgi
import webapp2

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.out.write("""<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>""")

app = webapp2.WSGIApplication([
  ('/', MainPage),
], debug=True)

guestbook.py

#!/usr/bin/env python
#
import cgi
import datetime
import webapp2

from google.appengine.ext import db
from google.appengine.api import users

class Greeting(db.Model):
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)


class MainPage(webapp2.RequestHandler):
  def get(self):
    content = self.request.get("content")
    self.response.out.write('<html><body>')
    greetings = db.GqlQuery("SELECT * "
                            "FROM Greeting "
                            "ORDER BY date DESC LIMIT 1")

    for greeting in greetings:
        self.response.out.write('<blockquote>%s</blockquote>' %
                              cgi.escape(greeting.content))

        self.response.out.write('</body></html>')


class Guestbook(webapp2.RequestHandler):
  def post(self):
    content = self.request.get("content")
    greeting = Greeting(content = content)
    greeting.put()
    self.redirect('/')


app = webapp2.WSGIApplication([
  ('/', MainPage),
  ('/sign', Guestbook)
], debug=True)
4

1 に答える 1

2

actionURL であり、モジュールではありません。定義した唯一の URL は/で、これは にルーティングされhome.appます。おそらく、フォームはそのモジュールによって提供されます。

編集GAE で URL がどのように機能するか、そして実際にはほとんどの Web フレームワークで URL がどのように機能するかを完全に誤解しています。index.htmlGAE の URLでもありませんhome.py。これらはそれぞれ、GAE が Web 要求への応答を作成するために使用できる HTML テンプレートと Python ファイルです。URLapp.yamlを Python 関数にマップします。あなたの場合、URL/を Python 関数home.appにマップしますhome.py

home.pyURLで使用することはありません。上で述べたように、actionは定義した URL の 1 つである必要があります。app.yamlまたは、Python モジュール内のルーティングをサポートする webapp などのフレームワークを使用している場合は、そこで定義されているサブ URL の 1 つでなければなりません。

もちろん、/静的index.htmlファイルにマップしたという問題もありますが、これは完全に間違っているようです。GAE で同じ URL を 2 つのハンドラーにマップできるとは思えませんが、試したことはありませんが、いずれにせよ、そのファイルは、そのまま提供するファイルではなく、おそらくテンプレートです。そのマッピングを削除します。

于 2012-07-05T15:31:05.707 に答える