我在GAE上创建一个简单的应用程序,允许用户输入图像和名称的URL。然后,应用程序将此图像及其名称上传到数据存储区。
上传后,页面自我重定向,然后将图像发送回客户端并将其显示在他们的计算机上。
该应用运行,但未显示任何图像。我得到的日志消息是:
AttributeError:'NoneType'对象没有属性'image'
蟒蛇:
import jinja2 # html template libary
import os
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))
import urllib
import urllib2
import webapp2
from google.appengine.ext import db
from google.appengine.api import urlfetch
class Default_tiles(db.Model):
name = db.StringProperty()
image = db.BlobProperty(default=None)
class MainPage(webapp2.RequestHandler):
def get(self):
# this just prints out the url which the user enters into input
image_name = self.request.get('image_name')
template_values = {
'image_name': image_name,
}
template = jinja_environment.get_template('index.html')
self.response.out.write(template.render(template_values))
class Upload(webapp2.RequestHandler):
def post(self):
# get information from form post upload
image_url = self.request.get('image_url')
image_name = self.request.get('image_name')
# create database entry for uploaded image
default_tile = Default_tiles()
default_tile.name = image_name
default_tile.image = db.Blob(urlfetch.Fetch(image_url).content)
default_tile.put()
self.redirect('/')
class Get_default_tile(webapp2.RequestHandler):
def get(self):
name = self.request.get('image_name')
default_tile = self.get_default_tile(name)
self.response.headers['Content-Type'] = "image/png"
self.response.out.write(default_tile.image)
def get_default_tile(self, name):
result = db.GqlQuery("SELECT * FROM Default_tiles WHERE name = :1 LIMIT 1", name).fetch(1)
if (len(result) > 0):
return result[0]
else:
return None
app = webapp2.WSGIApplication([('/', MainPage),
('/upload', Upload),
('/default_tile_img', Get_default_tile)],
debug=True)
HTML:
<html>
<head>
<link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
</head>
<body>
<form action="/upload" method="post">
<div>
<p>Name: </p>
<input name="image_name">
</div>
<div>
<p>URL: </p>
<input name="image_url">
</div>
<div><input type="submit" value="Upload Image"></div>
</form>
<img src="default_tile_img?{{ image_name }}">
</body>
</html>
感谢您的帮助。
答案 0 :(得分:1)
首先,您需要将GET
参数发送回MainPage
处理程序。如果您将其放在重定向行的Upload
处理程序中,则此功能应该有效:
self.redirect('/?image_name=%s' % image_name)
这将确保MainPage
知道我们刚上传的图片。
第二个问题只是模板中的<img>
标记。它应该是这样的:
<img src="default_tile_img?image_name={{image_name}}">
在进行这些更改之后,我已经在我的测试结果中进行了测试,并且它可以正常工作。
除了你的GET
参数外,一切都很好。请记住,当您传递GET
请求时,您需要指定其名称和值,以便您的应用可以从标头中正确获取。例如,如果您希望标头指定image_name是什么,则可以传递此URL:
http://domain.com/?image_name=name
而不是:
http://domain.com/?name