GAE上传图像然后动态地为图像提供服务

时间:2013-02-01 23:54:05

标签: google-app-engine server-error

我正在尝试在GAE上创建一个简单的应用程序,允许用户输入图像和名称的URL。然后,应用程序将此图像及其名称上传到数据存储区。

上传后,页面自我重定向,然后将图像发送回客户端并将其显示在他们的计算机上。

运行后,我得到的是服务器错误。由于我是GAE的新手,请有人告诉我,我的代码是否至少是正确的。

我看不出我的代码有什么问题。 (我检查了正确的缩进和空格)。以下是代码:

蟒蛇:

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):

    template = jinja_environment.get_template('index.html')
    self.response.out.write(template.render())

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('/?' + urllib.urlencode({'image_name': image_name}))


class Get_default_tile(webapp.RequestHandler):
  def get(self):
    name = self.request.get('image_name')
    default_tile = get_default_tile(name)

    self.response.headers['Content-Type'] = "image/png"
    self.response.out.write(default_tile.image)

    def get_default_tile(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>

任何帮助都会非常感激。谢谢你!

更新

感谢Greg,我知道如何查看错误日志。正如格雷格说我错过了一个逗号,我已经更新了上面的代码。

该应用程序现在可以运行,但是当我上传图片时,返回时不会显示图片。我在日志中收到以下消息:

文件“/ Users / jamiefearon / Desktop / Development / My Programs / GAE功能齐全的网站,包含css,javascript和images / mywebsite.py”,第53行,获取     default_tile = self.get_default_tile(name) TypeError:get_default_tile()只取1个参数(给定2个)

我只将一个参数传递给 get_default_tile()为什么它抱怨我通过了两个?

2 个答案:

答案 0 :(得分:2)

您在WSGIApplication设置中('/upload', Upload)之后缺少逗号。

答案 1 :(得分:0)

使用此python代码

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):
      template = jinja_environment.get_template('index.html')
      self.response.out.write(template.render())

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('/?' + urllib.urlencode({'image_name': image_name}))


class Get_default_tile(webapp2.RequestHandler):
    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
    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)




app = webapp2.WSGIApplication([('/', MainPage),
                               ('/upload', Upload),
                               ('/default_tile_img', Get_default_tile)],
                              debug=True)