3

下午好,

我目前正在尝试在 Google AppEngine 内部构建一些非常简单的东西。目标是构建一个简单的照片共享应用程序,它将连接回我的 iPhone 应用程序。这对 Python 和 Objective-C 来说都是一次学习经历。

(我从事 PHP 程序员已经有一段时间了)。

目标是创建如下所示的 URL:/img/{{ model.key.id }}

问题是,似乎无论我如何执行 python 脚本,我最终都会出现错误,或者根本无法在包含在 FOR 语句中的模板页面上显示任何内容。

我的 App.yaml 文件:

application: randomwebappname
version: 1
runtime: python
api_version: 1

handlers:
- url: /media
  static_dir: media

- url: /b/.*
  script: beta.py
  login: required

- url: /.*
  script: main.py

我的模型(在 beta.py 中):

class Photo(db.Model):
    author = db.StringProperty()
    title = db.StringProperty()
    slugline = db.StringProperty()
    content = db.StringProperty(multiline=True)
    coordinates = db.StringProperty()
    avatar = db.BlobProperty()
    date = db.DateTimeProperty(auto_now_add=True)

我的班级查看图像页面:

class ViewPage(webapp.RequestHandler):
def get(self, id):


template_values = {
    'image': image,
}

path = os.path.join(os.path.dirname(__file__), 'templates/view.html')
self.response.out.write(template.render(path, template_values))

我在课堂上尝试了以下所有方法,但都以失败告终。我在 URL 中使用 key、key.name 和 key.id 尝试了它们:

photos = db.Query(Photo).filter('key', slug).fetch(limit=1)

photos = Photo.get_by_key_name(id)

photos = Photo.get_by_key_name(key)

key = db.Key.from_path('Photo', id) 

photos = db.GqlQuery("SELECT * FROM Photo WHERE __key__ = :key", key=key)

photos = db.get(photo_key)

photos = self.request.get("id")

我的网址:

application = webapp.WSGIApplication([
    ('/b/', HomePage),
    ('/b/upload', UploadPage),
    ('/b/add', MainPage),
    ('/b/img', Image),
    ('/b/img/([-\w]+)', ViewPage),
    ('/b/submit', Submission)
], debug=True)

模板查询:

{% for photo in photos %}
<img alt="" title="" src="img?img_id={{ photo.key }}" alt="main image" />
{% endfor %}

这似乎是一件非常简单的事情,我知道我错过了一些东西,但我只是不确定它在哪里。我会用 PHP 写这个,但我喜欢 AppEngine 的概念,我在上面说过,这是一个很好的 Python 学习体验。

附带说明一下,此应用程序确实可以在网站的主页上运行。我只是有一个 GQL 查询,它输出图像很好,当我尝试转到 /img/id 页面时它只是失败了。

有什么建议吗?提前致谢!

更新#1
根据乔纳森的要求,以下是 Image 类:

class Image (webapp.RequestHandler):
    def get(self):
        photo = db.get(self.request.get("img_id"))
        if photo.avatar:
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write(photo.avatar)
        else:
            self.response.out.write("No image")

此外,在发布此内容后,我意识到这是问题的一部分,因为我试图将 /img 作为实际图像并 /img/ 显示视图页面。我已经改变了这一点,现在有了一个工作模型。但它基于 Key 而不是 key.id:

网址:

('/b/i', ViewPage)

新的 ViewPage 类:

class ViewPage(webapp.RequestHandler):
    def get(self):
    image = db.get(self.request.get("id"))  

    template_values = {
        'image': image,
    }

    path = os.path.join(os.path.dirname(__file__), 'templates/view.html')
    self.response.out.write(template.render(path, template_values))

所以...要访问查看页面(包括评论等),您现在必须访问以下 URL:/b/i?img_id={{ image.key }}

至少页面现在可以正常工作,但我更希望页面看起来像上面所说的那样:/b/img/{{ image.key.id }}

更新#2:更新了 ViewPage 类以及 URL:

class ViewPageV2(webapp.RequestHandler):
    def get(self, id):
    images = [ db.get(id) ]

    template_values = {
        'image': image,
    }

    path = os.path.join(os.path.dirname(__file__), 'templates/view.html')
    self.response.out.write(template.render(path, template_values))

新网址:('/b/image/([-\w]+)', ViewPageV2),

以下是两个屏幕截图,其中一个是 id "1" 存在的证明和当前随之而来的错误。

替代文字 http://img215.imageshack.us/img215/9123/screenshot20091130at937.png

替代文字 http://img215.imageshack.us/img215/2207/screenshot20091130at938.png

再次感谢大家!

4

1 回答 1

3

一个简单的方法来抓住它们:

photos = Photo.gql('ORDER BY __key__')

有关更多信息,请参阅App Engine 文档中的键查询。

您是否使用预定义的密钥存储照片?

photo = Photo(key_name="xzy123")
photo.put()

然后您可以在 ViewPage 中检索它:

photos = [ Photo(key_name="%s" % id) ]

请参阅使用密钥获取实体

最后,要根据 appengine 分配的键检索照片并假设该键存在于 URL 中(例如http://host/b/img/ahByY...因此更改您的模板以生成这种形式的 URL),使用

class ViewPage(webapp.RequestHandler):
  def get(self, id):
    photos = [ db.get(id) ]
    ...
于 2009-11-29T21:18:52.813 回答