-2

我需要 index.py 上的表单,以及由 guestbook.py 处理的 Datastore 查询响应(此处为“comment”),因此表单响应在表单提交后显示给访问者,因此有 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"

索引.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)

留言簿.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

action是一个 URL,而不是一个模块。您定义的唯一 URL 是/,它路由到home.app. 大概您的表单由该模块提供。

编辑您完全误解了 URL 在 GAE 中的工作方式,实际上在大多数 Web 框架中也是如此。GAE 的 URL也不index.htmlhome.py:它们分别是一个 HTML 模板和一个 Python 文件,GAE 可以使用它来构建对 Web 请求的响应。您app.yaml将 URL 映射到 Python 函数。在您的情况下,它将 URL 映射/到 Python 函数home.app,该函数位于home.py.

您绝不会home.py在 URL 中使用。如上所述,action必须是您在其中定义的 URL 之一,app.yaml或者,如果您正在使用支持 Python 模块内部路由的 webapp 等框架,则必须是其中定义的子 URL 之一。

当然,你也有映射/到静态index.html文件的问题,这似乎是完全错误的。我非常怀疑您是否可以将相同的 URL 映射到 GAE 中的两个处理程序,尽管我从未尝试过,但无论如何,该文件可能是一个模板,而不是您想要按原样提供的文件。删除该映射。

于 2012-07-05T15:31:05.707 回答