Frage

I'm trying to make a simple app on GAE that allows a user to enter a url to an image and a name. The app then uploads this image to the Datastore along with its name.

After the upload the page self redirects and then should send the image back to the client and display it on their machine.

After running all I get is a Server error. Since I am new to GAE please could someone tell me if my code is at least correct.

I can't see what is wrong with my code. (I have checked for correct indentation and whitespace). Below is the code:

The 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(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)

The 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>

Any help at all will be so much appreciated. Thanks you!

UPDATE

Thanks to Greg, I know know how to view error logs. As Greg said I was missing a comma, I have updated the code above.

The app now runs, but when I upload an image, no image shows on return. I get the following message in the log:

File "/Users/jamiefearon/Desktop/Development/My Programs/GAE Fully functional website with css, javascript and images/mywebsite.py", line 53, in get default_tile = self.get_default_tile(name) TypeError: get_default_tile() takes exactly 1 argument (2 given)

I only passed one argument to get_default_tile() why does it complain that I passed two?

War es hilfreich?

Lösung

You're missing a comma after ('/upload', Upload) in the WSGIApplication setup.

Andere Tipps

use this python code

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top