下午好,
我目前正在尝试在 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
再次感谢大家!