【问题标题】:Dynamic URL's inside Google's AppEngineGoogle App Engine 中的动态 URL
【发布时间】:2009-11-29 19:41:20
【问题描述】:

下午好,

我目前正在尝试在 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))

所以...要访问查看页面(包括 cmets 等),您现在必须访问以下 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" 存在的证明和当前出现的错误。

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

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

再次感谢大家!

【问题讨论】:

  • 能否给出当 URL 为 '/b/img' 时调用的 Image 类的代码?
  • 乔纳森,我很抱歉,我完全忘记发布了。此后,我使用非干净的 URL 和 {{ image.key }} 使页面按上述方式工作。如果可能的话,仍然真的希望用 {{ image.key.id }} 获得一个更清晰的 URL。
  • 人们可能会觉得有用的相关答案可以在以下位置找到:stackoverflow.com/questions/4594602/…

标签: python google-app-engine dynamic-url


【解决方案1】:

一个简单的方法来获取它们:

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 分配的密钥检索照片并假设该密钥存在于 URL 中(例如http://host/b/img/ahByY...,因此更改您的模板以生成这种形式的 URL) , 使用

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

【讨论】:

  • gbacon,感谢您的回复!现在,在主页上,我正在通过以下方式查询所有内容: query_str = "SELECT * FROM Photo ORDER BY date DESC LIMIT 10" photos = db.GqlQuery (query_str) 这是我希望人们能够使用的子页面评论我有问题的图片。不过,为了回答您的问题,我没有使用任何预定义的键,只是让谷歌在将信息插入数据库时​​分配一个键。我承认我非常习惯 MySQL,而且 AppEngine 上的 Datastore 有一些我还不太习惯的怪癖。
  • 是的,根据文档,get 函数的签名是get(*args),并且正则表达式捕获在此处传递。要获取所有记录,您不只是photos = Photo.all().order('-date').fetch(1000)吗?
  • 另外,不要忘记将任何 cmets 的父级设置为图像:code.google.com/appengine/docs/python/datastore/…
  • 再次感谢大家的帮助! gbacon,我已按照您的说明更改了代码以匹配,但出现以下错误:'无效的字符串键 %s。详细信息:%s' % (encoded, e)) BadKeyError: Invalid string key 1===。详细信息:不正确的填充
  • 不确定1=== 的来源。在 SDK 控制台中检查数据存储中的照片。单击其中一张照片,将其密钥复制到 http://localhost:PORT/b/img/ 的末尾并访问生成的 URL(确保 PORT 是您的应用程序的端口)应该显示您的图像,如果从末尾更改为您的 ViewPage我的答案是连接到/b/img/([-\w]+)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2016-06-12
相关资源
最近更新 更多