【问题标题】:Google App Engine returning odd values from datastoreGoogle App Engine 从数据存储区返回奇数值
【发布时间】:2015-02-05 20:44:40
【问题描述】:

我正在尝试将一个简单的保存字符串保存到数据存储区,重定向到该实体的键,然后在下一个处理程序中获取它。当我在 PDFHandler 中调用以获取字符串 (a.name()) 时,每次都会返回“w”,无论我输入什么。

class Pdf(db.Model):
    name = db.StringProperty(required=True)

class InputHandler(Handler):
    def get(self):
        self.render('cert_form.html')

    def post(self):
        name = self.request.get('name')

        if name:
            a = Pdf(name=name)
            a.put()
            self.redirect('/key=%s' % a.key())
        else:
            error = "Please enter your full name."
            self.render('cert_form.html')

class PDFHandler(Handler):
    def get(self, id):
        a = db.Key.from_path('Pdf', id)


        self.response.write(a.name())

application = webapp2.WSGIApplication([
    (r'/', InputHandler),
    (r'/key=(.)+', PDFHandler),
], debug=True)

【问题讨论】:

  • 您在 appengine 数据存储查看器中看到的 PDF 实体名称字段的值是什么?
  • 它给出了“Bobby Smith”、“John Adams”等名称。这是另一个问题。我已经到了可以返回实体键的地步。我如何从中简单地查找实体属性(名称,id)?当我输入 post = key.get() 我得到 AttributeError: 'str' object has no attribute 'get'
  • 看起来像当你调用 key.get() - key 是一个字符串而不是一个 Key 对象。如果您从 url 获取密钥 - 您将需要获取该字符串并在调用 get() 之前为该实体创建一个 Key 对象。
  • 您是否有理由必须使用老旧的 db 而不是广受欢迎的新 ndb?我对db如此生疏了,我需要很长的刷新周期来帮助解决这个问题——这么多年来,我只使用了ndb!另外,我怀疑您的r'/key=(.)+' 究竟捕获了什么——重复组而不是其内容,多么奇怪的 RE 模式?!为什么不是普通的r'/key=(.+)',毫无疑问地捕获重复的内容?至少尝试在PDFHandler 中记录id,看看它是不是你认为的那样......

标签: python python-2.7 google-app-engine google-cloud-datastore


【解决方案1】:

当你这样做时,在你的 PDFHandler 中

a = db.Key.from_path('Pdf', id)

你得到的是 Key 对象而不是实体。

要获取 Pdf 实体,您可以执行以下操作

pdf = db.get(a)

然后您可以访问 pdf 上的字段,例如 pdf.name 等。

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多