python - Google App Engine 中的动态 URL

标签 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/来显示 View 页面。我已经改变了这一点,现在有了一个工作模型。但它基于 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”存在的证据以及当前伴随它而来的错误。

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

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

再次感谢大家!

最佳答案

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

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

有关更多信息,请参阅 Queries on Keys在 App Engine 文档中。

你在存储你的照片吗with predefined keys

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

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

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

参见 Getting an Entity Using a Key .

最后,根据 appengine 分配的 key 检索照片并假设该 key 存在于 URL 中(例如http://host/b/img/ahByY。 ..,因此请更改您的模板以生成这种形式的 URL),使用

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

关于python - Google App Engine 中的动态 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1816529/

相关文章:

python - 在复杂字符串后插入换行符时 Vim 巨大的延迟

python - 按值比较 lambda 表达式指针

google-app-engine - Gorilla session 从 session golang 中提取结构值

python - 如何重定向到 Django 中的动态 URL

php - SEO - 同时使用漂亮的 URL 和动态 URL

php - 如何根据我在 codeigniter session 中拥有的电子邮件返回数据?

带有if语句的python数据框 bool 值

python - 在 TensorFlow 中添加多个层导致损失函数变为 Nan

google-app-engine - 不使用 App Engine 的原因

python - google-app-engine-django 加载装置