【问题标题】:How to use get_serving_url in appengine?如何在 appengine 中使用 get_serving_url?
【发布时间】:2010-10-05 13:26:06
【问题描述】:

以下是我目前的 main.py。

import cgi
import datetime
import logging

from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import images

logging.getLogger().setLevel(logging.DEBUG)


class Greeting(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    imageblob = blobstore.BlobReferebceProperty()
    date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp.RequestHandler):
    def get(self):
        self.response.out.write('<html><body>')
        query_str = "SELECT * FROM Greeting ORDER BY date DESC LIMIT 10"
        greetings = db.GqlQuery (query_str)

        for greeting in greetings:
            if greeting.author:
                self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
            else:
                self.response.out.write('An anonymous person wrote:')
            self.response.out.write("<div><img src='img?img_id=%s'></img>" %
                                greeting.key())
            self.response.out.write(' %s</div>' %
                              cgi.escape(greeting.content))

        self.response.out.write("""
          <form action="/sign" enctype="multipart/form-data" method="post">
            <div><label>Message:</label></div>
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><label>Avatar:</label></div>
            <div><input type="file" name="img"/></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
        </html>""")

class Image (webapp.RequestHandler):
    def get(self):
        greeting = db.get(self.request.get("img_id"))
        if greeting.avatar:
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write(greeting.avatar)
        else:
            self.response.out.write("No image")

class Guestbook(webapp.RequestHandler):
    def post(self):
        greeting = Greeting()
        if users.get_current_user():
            greeting.author = users.get_current_user()
        greeting.content = self.request.get("content")
        avatar = get_serving_url(self.request.get("img"), size=None, crop=False)
        #avatar = images.crop(self.request.get("img"), 0.0, 0.0,1.0,0.5)
        greeting.avatar = db.Blob(avatar)
        greeting.put()
        self.redirect('/')


application = webapp.WSGIApplication([
    ('/', MainPage),
    ('/img', Image),
    ('/sign', Guestbook)
], debug=True)


def main():
    run_wsgi_app(application)


if __name__ == '__main__':
    main()

【问题讨论】:

  • 请告诉我们问题出在哪里以及您为什么要尝试完成 - 它会为您提供更快更好的答案。
  • @Sudhir 我基本上希望我的所有图像都以相同的宽度和高度呈现。当我使用图像 api 的调整大小功能时,它只满足一个属性(宽度或高度)。由于 get_serving_url 比 images api 更动态,我想使用它。

标签: image google-app-engine image-processing


【解决方案1】:

就像the docs中所说的那样:

返回提供图片的 URL。 此 URL 格式允许动态 调整大小和裁剪,所以你不 需要存储不同的图像尺寸 服务器。图像以低 从高度优化的延迟, 无 cookie 基础架构。

在您的代码中,您似乎使用get_serving_url() 来构造Blob。这不起作用,因为get_serving_url() 返回的是 URL,而不是图像数据。

您似乎还混淆了 blobstore.BlobReferencePropertydb.BlobProperty - BlobReferenceProperty 引用上传并存储在 blobstore 中的对象,而 BlobProperty 将 blob 数据直接存储在数据存储区中。

解决您的问题的更好方法是将您在请求中获得的图像(作为BlobProperty)存储在您的模型中,然后使用get_serving_url() 以不同的大小提供它。

或者,如果您希望存储大图像,请将图像存储在 blobstore 中并使用 BlobReferenceProperty - 无论哪种方式,您都应该只使用 get_serving_url()提供图像,而不是存储它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2015-06-01
    • 2013-07-24
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多