0

ユーザーが画像と名前のURLを入力できるGAEのシンプルなアプリを作成しています。次に、アプリはこの画像をその名前とともにデータストアにアップロードします。

アップロード後、ページは自己リダイレクトし、画像をクライアントに送り返して、クライアントのマシンに表示する必要があります。

アプリは実行されますが、画像は表示されません。私が受け取るログメッセージは次のとおりです。

AttributeError:'NoneType'オブジェクトに属性'image'がありません

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

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

ご協力いただきありがとうございます。

4

1 に答える 1

1

まず、GETパラメータをMainPageハンドラーに送り返す必要があります。これはUpload、リダイレクト行のハンドラーに配置すると機能するはずです。

self.redirect('/?image_name=%s' % image_name)

これにより、アップロードした画像が確実にMainPageわかります。

2番目の問題は<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

于 2013-02-02T02:57:07.613 に答える