我的图像未从数据存储区提供,我在图像应在的页面上收到 404 错误。
这是代码:
import cgi
import datetime
import urllib
import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.api import images
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class PropUpload(db.Model):
property_name = db.StringProperty()
property_address = db.StringProperty()
project_type = db.StringProperty()
building_size = db.StringProperty()
stories = db.StringProperty()
space_available = db.StringProperty()
per_leased = db.StringProperty()
prop_image = db.BlobProperty()
date = db.DateTimeProperty(auto_now_add=True)
class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write("""<!DOCTYPE html>
<html lang="en">
<head>
<somehtml>""")
display2 = db.Query(PropUpload)
display2.order("-date")
for dis in display2:
self.response.out.write('<div><img src="img?img_id=%s"></img>' % dis.key())
self.response.out.write('<h4>Property Name: %s </h4><br>' % dis.property_name)
self.response.out.write('<div style="border-bottom: 1px solid #CCC;">Address: %s </div><br>' % dis.property_address)
self.response.out.write('<div style="border-bottom: 1px solid #CCC;">Type: %s ft<sup>2</sup></div><br>' % dis.project_type)
self.response.out.write('<div style="border-bottom: 1px solid #CCC;">Stories: %s </div><br>' % dis.stories)
self.response.out.write("<more html>")
class Image(webapp.RequestHandler):
def get(self):
img_id = self.request.get("img_id")
dis = db.get(self.request.get("img_id"))
if dis.prop_image:
self.response.headers['Content-Type'] = "image/png"
self.response.out.write(dis.prop_image)
else:
self.response.out.write("no image")
class UploadPage2(webapp.RequestHandler):
def get(self):
self.response.out.write("""<!DOCTYPE html>
<form action="/upload2" enctype="multipart/form-data" method="post">
<div><label>Property Name: </label></div>
<div><textarea name="prop-name" rows="1" columns "100"></textarea></div>
<br><br>
<div><label>Property Address: </label></div>
<div><textarea name="address" rows="1" columns "100"></textarea></div>
<br><br>
<div><label>Property Type: </label></div>
<div><textarea name="prop-type" rows="1" columns "100"></textarea></div>
<br><br>
<div><label>Building Size: </label></div>
<div><textarea name="size" rows="1" columns "100"></textarea></div>
<br><br>
<div><label>Stories: </label></div>
<div><textarea name="stories" rows="1" columns "100"></textarea></div>
<br><br>
<div><label>Space Available: </label></div>
<div><textarea name="title" rows="2" columns "100"></textarea></div>
<br>
<div><label>Percent Leased:</label></div><span>
<div><textarea name="percent" rows="3" cols="100"></textarea></div><br>
<div><label>Picture:</label></div>
<div><input type="file" name="img"/></div>
<div><label></label></div><span>
<div><input type="submit" value="Upload" /></div>
</form>""")
def post(self):
props = PropUpload()
property_name = self.request.get('prop-name')
property_address = self.request.get('address')
property_type = self.request.get('prop=type')
building_size = self.request.get('size')
stories = self.request.get('stories')
space_available = self.request.get('space')
prop_image = self.request.get('img')
per_leased = self.request.get('percent')
props.property_name = property_name
props.property_address = property_address
props.property_type = property_type
props.building_size = building_size
props.stories = stories
props.space_available = space_available
props.prop_image = db.Blob(prop_image)
props.per_leased = per_leased
props.put()
self.redirect('/upload2')
application = webapp.WSGIApplication([
('/', MainPage),
('/upload2', UploadPage2),
], debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
除了 404 之外,一切正常,而且我在谷歌上找不到任何问题。
感谢您的帮助,很抱歉,如果我遗漏了任何内容,我会编辑任何内容。
最佳答案
假设您的上传工作正常,您需要为图像本身提供一个处理程序。现在您正在引用 <img src="img?img_id=%s">
,但是img
似乎不会解析处理程序中的任何内容(此外,您不需要为 HTML 中的 </img>
属性提供结束 <img>
标记)。您想要做的是为基于图像的请求设置一个处理程序,并让响应为图像本身。您已经拥有Image
出于该目的而设置(请注意,您可能希望将 no image
部分替换为实际图像,以便结果类型保持一致)。
为了映射Image
处理程序到 URL,请尝试按如下方式修改您的处理程序:
application = webapp.WSGIApplication([
('/', MainPage),
('/img', Image),
('/upload2', UploadPage2),
], debug=True)
现在会将请求路由到 /img
到Image
处理程序(您可能还想将 src
标记更改为 <img src="/img?img_id=%s">
,然后它应该在其中找到并返回您的图像。
关于python - 尝试从 GAE 动态提供图像,得到 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938394/