【问题标题】:Appengine wildcard URL issuesAppengine 通配符 URL 问题
【发布时间】:2014-10-23 17:26:23
【问题描述】:

我的 Google 应用引擎中有一个页面需要根据通过页面 URL 提供的参数从数据存储中获取记录。页面的 URL 类似于 http://example.appspot.com/page/WILDCARD/,其中 WILDCARD 是记录的唯一标识符(32 个字符的十六进制字符串)。然后它获取 WILDCARD 指定的记录并将其显示在模板page.html 上,或者至少这是它应该做的。每当我以http://example.appspot.com/page/WILDCARD/ 身份访问该页面时,都会收到 404 错误。有谁知道为什么/有人可以提出为什么会这样的原因吗?谢谢。

在我的 WSGI 类处理程序中,我有

('/page/([^/]+)/', PageHandler),

PageHandler 类本身是

class PageHandler(webapp2.RequestHandler):
    def get(self, recordID):
            allrecords = db.GqlQuery("SELECT RECORD FROM RECORDS WHERE recordid = :record",record = recordID)
            if not allrecords:
                self.redirect("../") #the URL is screwed up, so we're redirecting you back to the main page
            else:
                for row in allrecords:
                    template = JINJA.get_template("page.html")
                    self.response.out.write(template.render({ "recordtext":row.RECORD, "recordid":recordID }))

附加细节:JINJA 只是默认的 jinja 环境,我很确定这没有什么问题。 RECORDS 是一个 db.Model 类型类,它具有成员 RECORD(文本属性)和 recordid(字符串属性)。它目前没有填充任何数据。

编辑:没关系,我解决了这个问题。当我简化问题时,这是我自己的愚蠢。事实证明,在实际实现中(即这个例子的复杂版本),我认为我的 URL 和 /page/ 的实际值之间存在微小差异。道歉。

【问题讨论】:

  • 你也可以链接你的 app.yaml 吗?我认为重定向可能根本没有正确放置在那里。
  • 我的 app.yaml 与这个简化的例子有很大的不同,但是我的 yaml 配置中与这个页面处理程序相关的唯一行是: - url: .* script: main.app secure: always跨度>

标签: google-app-engine python-2.7 wsgi


【解决方案1】:

试试

webapp2.Route('/page/<recordID>/', handler=PageHandler)

为您的路线定义。

您可以将它插入到您的其他路由元组中,例如:

app = webapp2.WSGIApplication([
    ('/', Homepage),
    webapp2.Route('/page/<recordID>/', handler=PageHandler),
    ('/otherpage', SomeOtherPage)
])

如果使用正确的正则表达式,您所拥有的内容可能也可以正常工作,但我发现在使用定义预期路径并命名它们的模板 URL 时更容易阅读代码。

查看更多:https://webapp-improved.appspot.com/guide/routing.html

【讨论】:

  • 我实际上使用app = webapp2.WSGIApplication([tuples of urls and handlers]) 作为我的应用程序定义,就像在基本的 Appengine Python 教程中使用的那样。你能告诉我如何在很多页面上使用上面的内容/将我链接到一个资源以使用上面的内容和/或修改它以与 WSGIApplication 方法一起使用吗?抱歉,我对 appengine 有点菜鸟!
  • 你可以简单地沿着你的其他元组插入这一行,看到更新的答案,因为显然我不能在这里写代码。
  • 嗯这很奇怪,页面仍然导致 404。
  • @user3697240 好的...你有路由'/page/'的处理程序吗?如果不是,那么当您输入无效的“recordID”时,您将得到 404。要解决这个问题,您需要使用 self.redirect("/") 而不是 self.redirect("../")
  • 是的,我确实有该页面的处理程序,但我绝对确定我有正确的记录 ID。
【解决方案2】:

没关系,我解决了这个问题。当我简化问题时,这是我自己的愚蠢。事实证明,在实际实现中(即这个例子的复杂版本),我认为我的 URL 和 /page/ 的实际值之间存在微小差异。道歉。

【讨论】:

    【解决方案3】:

    这对我有用:

    app = webapp2.WSGIApplication([
    ('/', Homepage),
    ('/page/.*', PageHandler),
    ('/otherpage', SomeOtherPage)
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多