Google AppEngine 内的动态 URL

3 投票
1 回答
3688 浏览
提问于 2025-04-15 16:30

下午好,

我现在正在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 个回答

3

有一个简单的方法可以一次性获取所有内容:

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) ]
    ...

撰写回答