本文介绍了如何在appengine中使用get_serving_url?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


以下是我的main.py。


$ b

  import cgi 
导入日期时间
导入日志记录
$ b $ from google.appengine.ext导入db
from google.appengine.api从google.appengine.ext导入用户
从google.appengine.ext.webapp.util导入webapp
从google.appengine.api导入run_wsgi_app
导入图像

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


类问候语(db.Model):
author = db.UserProperty()
content = db.StringProperty(multiline = True)
imageblob = blobstore.BlobReferebceProperty()
date = db.DateTimeProperty(auto_now_add = True)
$ b $ 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 greeti ng在问候语中:
if greeting.author:
self.response.out.write('< b>%s< / b>写道:'%greeting.author.nickname())
else:
self.response.out.write('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 = / signenctype =multipart / form-datamethod =post>
< div>< label> Message:< / label>< / div>
< div> ;< / tag>< / label>;< textarea name =contentrows =3cols =60>< / textarea>< / div>
< div>< label> < / div>
< div>< input type =filename =img/>< / div>
< div>< input type =submit值=签名留言>< / div>
< /形式>
< / 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)

类留言簿(webapp.RequestHandler):
def post(self):
greeting = Greeting()$ b $如果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',图片),
('/ sign',留言簿)
],debug = True)

$ b $ def main():
run_wsgi_app(应用程序)

$ b如果__name__ =='__main__':
main()


解决方案

像:

在您的代码中,使用 get_serving_url()来构造 Blob 。这是行不通的,因为 get_serving_url()会返回一个URL,而不是图片数据。

混淆和 - a BlobReferenceProperty 引用上传并存储在,而 BlobProperty 直接将数据存储在数据存储中。 / p>

解决您的问题的更好方法是将您获取的图像存储在请求中(作为 BlobProperty )您的模型,然后使用 get_serving_url()以不同的大小提供服务。或者,我如果您希望存储大图像,将图像存储在Blobstore中并使用 BlobReferenceProperty - 无论如何,您应该只使用 get_serving_url( )服务图片,而不是存储它。


The following is my main.py so far.

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()
解决方案

Like it says in the docs:

In your code you seem to be using get_serving_url() to construct a Blob. This will not work, since get_serving_url() returns a URL, not the image data.

You also seem to be confusing a blobstore.BlobReferenceProperty and a db.BlobProperty -- a BlobReferenceProperty references an object uploaded and stored in the blobstore while a BlobProperty stores blob data directly in the datastore.

A better solution to your problem would be to store the image you get in the request (as a BlobProperty) in your model, then serve it at different sizes using get_serving_url().

Alternatively, if you expect to be storing large images, store the images in the blobstore and use the BlobReferenceProperty -- either way, you should only be using get_serving_url() to serve the image, not in storing it.

这篇关于如何在appengine中使用get_serving_url?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 16:26