从Google应用引擎数据存储区中的Key获取实体属性

时间:2015-02-05 04:49:43

标签: python google-app-engine

我正在传递处理程序的url中传递模型实体的id,而在另一个我只需要从该id中查找属性值。

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)

1 个答案:

答案 0 :(得分:1)

self.redirect('%s' % str(a.key().id()))(除了%s的完全冗余和str - 失去str调用! - )重定向到一个非常随意的字符串的URL。你是如何路由的,大概是PDFHandler,所以它可以得到它id

更明智和常见的方法是重定向到,例如,

'/pdfh?id=%s' % urllib2.urlencode(whatever)

或者可能更好

'/pdfh?k=%s' % a.key().urlsafe()

并在处理程序中使用self.request.get来获取id(或者更好的是url-safe形式的密钥,为ndb.Key(urlsafe=...调用做好准备,以便为您提供实际使用的密钥)。< / p>

这些方法使得路由显而易见 - 用你非常特殊的方法,我需要看到路由来解释为什么它不起作用(这种奇怪的路由工作的机会不是零,但是,非常小的:-)。顺便说一句,我需要在app.yaml中看到第一层路由,在Python代码中看到第二层。

或者,您可以切换到更合理的URL方案,并在23秒内完成: - )。