Google AppEngine 内的动态 URL
下午好,
我现在正在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")
我的URL:
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:
根据Jonathan的要求,以下是图片类:
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:
URL:
('/b/i', 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:查看页面类和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))
新URL: ('/b/image/([-\w]+)', ViewPageV2),
以下是两张截图,其中一张是id "1" 存在的证明,另一张是当前出现的错误。
alt text http://img215.imageshack.us/img215/9123/screenshot20091130at937.png
alt text http://img215.imageshack.us/img215/2207/screenshot20091130at938.png
再次感谢大家!
1 个回答
有一个简单的方法可以一次性获取所有内容:
photos = Photo.gql('ORDER BY __key__')
想了解更多,可以查看App Engine文档中的键查询。
你是否在使用预定义的键来存储你的照片?
photo = Photo(key_name="xzy123")
photo.put()
那么你可以在你的视图页面中获取它:
photos = [ Photo(key_name="%s" % id) ]
查看如何使用键获取实体。
最后,要根据App Engine分配的键来获取一张照片,并假设这个键在网址中存在(例如,http://host/b/img/ahByY...
,所以你需要修改你的模板来生成这种格式的URL),可以使用
class ViewPage(webapp.RequestHandler):
def get(self, id):
photos = [ db.get(id) ]
...