动态网址位于Google的AppEngine中

时间:2009-11-29 19:41:21

标签: python google-app-engine dynamic-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")

我的网址:

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的要求,以下是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:

URL:

('/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类以及网址:

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”的证明,以及当前附带的错误。

alt text http://img215.imageshack.us/img215/9123/screenshot20091130at937.png

alt text http://img215.imageshack.us/img215/2207/screenshot20091130at938.png

再次,谢谢大家!

1 个答案:

答案 0 :(得分:3)

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

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

有关详情,请参阅App Engine文档中的Queries on Keys

您是否正在存储照片with predefined keys

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

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

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

请参阅Getting an Entity Using a Key

最后,要根据其appengine指定的密钥检索照片并假设此密钥存在于网址中(例如http://host/b/img/ahByY...,请更改模板以生成此网址表格),使用

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