2013-02-02 3 views
0

저는 사용자가 이미지와 이름에 대한 URL을 입력 할 수있는 간단한 응용 프로그램을 만들고 있습니다. 그런 다음이 이미지를 이름과 함께 데이터 스토어에 업로드합니다.GAE 오류 AttributeError : 'NoneType'객체에 'image'속성이 없습니다.

업로드 후 페이지가 자동으로 리디렉션 된 다음 이미지를 클라이언트로 보내고 자신의 컴퓨터에 표시해야합니다.

앱이 실행되지만 이미지가 표시되지 않습니다. 내가 얻을 로그 메시지는 다음과 같습니다

AttributeError는 'NoneType'개체가 어떤 속성 '이미지'

이 없습니다 파이썬 :

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

편집 : 당신이 여기서 image_name이 무엇인지 지정하는 헤더를 원하는 경우 예를 들어, 당신은이 URL을 전달할 것입니다 실제로 질문을 오해. 그것으로 지금 다시 보아라. – Nate

+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 요청을 전달할 때 앱이 헤더에서 올바르게 가져올 수 있도록 이름과 값을 지정해야합니다. 대신

http://domain.com/?image_name=name

:

http://domain.com/?name

+0

완벽하게 도와 주셔서 감사합니다. –

+0

아무 문제 없지만 계속 사용하십시오. GAE는 꽤 재미있을 수 있습니다. – Nate

관련 문제