我创建了一个存储文件名的实体'Images'和一个用于存储图像的blob对象:
class Images(ndb.Model):
file_name = ndb.StringProperty()
blob = ndb.BlobProperty()
现在,我尝试在我的应用程序中显示'database.jpeg'图像,如下所示:
HTML表单
<html>
<head>
<title>Template</title>
</head>
<body>
<img src="/img_serve/database.jpeg" />
</body>
</html>
Python文件:
class ImgServe(Handler):
def get(self, resource):
image = ndb.Key('Images', resource).get()
self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0]
self.response.write(image.blob)
app = webapp2.WSGIApplication([('/', MainPage),
('/signup', Register),
('/login', Login),
('/logout', Logout),
('/mp', MP),
(r'/file_upload', FileUpload),
('/blob', Blob),
(r'/img_serve/<resource:(.*)>', ImgServe),
('/template', Template)], debug=True)
以下是“图片”实体的屏幕截图:
但是,我的应用程序中出现了损坏的图像。我的代码中似乎有什么问题?
整个代码:
main.py
import os
import re
import random
import hashlib
import hmac
from string import letters
import mimetypes
import webapp2
import jinja2
from google.appengine.ext import ndb
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),
autoescape = True)
secret = 'fart'
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def make_secure_val(val):
return '%s|%s' % (val, hmac.new(secret, val).hexdigest())
def check_secure_val(secure_val):
val = secure_val.split('|')[0]
if secure_val == make_secure_val(val):
return val
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
params['user'] = self.user
return render_str(template, **params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
def set_secure_cookie(self, name, val):
cookie_val = make_secure_val(val)
self.response.headers.add_header(
'Set-Cookie',
'%s=%s; Path=/' % (name, cookie_val))
def read_secure_cookie(self, name):
cookie_val = self.request.cookies.get(name)
return cookie_val and check_secure_val(cookie_val)
def login(self, user):
self.set_secure_cookie('user_id', str(user.key().id()))
def logout(self):
self.response.headers.add_header('Set-Cookie', 'user_id=; Path=/')
def initialize(self, *a, **kw):
webapp2.RequestHandler.initialize(self, *a, **kw)
uid = self.read_secure_cookie('user_id')
self.user = uid and User.by_id(int(uid))
class MainPage(Handler):
def get(self):
self.render("home.html")
##### user stuff
def make_salt(length = 5):
return ''.join(random.choice(letters) for x in xrange(length))
def make_pw_hash(name, pw, salt = None):
if not salt:
salt = make_salt()
h = hashlib.sha256(name + pw + salt).hexdigest()
return '%s,%s' % (salt, h)
def valid_pw(name, password, h):
salt = h.split(',')[0]
return h == make_pw_hash(name, password, salt)
def users_key(group = 'default'):
return ndb.Key.from_path('users', group)
class Images(ndb.Model):
file_name = ndb.StringProperty()
blob = ndb.BlobProperty()
class User(ndb.Model):
name = ndb.StringProperty(required = True)
pw_hash = ndb.StringProperty(required = True)
email = ndb.StringProperty()
@classmethod
def by_id(cls, uid):
return User.get_by_id(uid, parent = users_key())
@classmethod
def by_name(cls, name):
u = User.all().filter('name =', name).get()
return u
@classmethod
def register(cls, name, pw, email = None):
pw_hash = make_pw_hash(name, pw)
return User(parent = users_key(),
name = name,
pw_hash = pw_hash,
email = email)
@classmethod
def login(cls, name, pw):
u = cls.by_name(name)
if u and valid_pw(name, pw, u.pw_hash):
return u
USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
return username and USER_RE.match(username)
PASS_RE = re.compile(r"^.{3,20}$")
def valid_password(password):
return password and PASS_RE.match(password)
EMAIL_RE = re.compile(r'^[\S]+@[\S]+\.[\S]+$')
def valid_email(email):
return not email or EMAIL_RE.match(email)
class Signup(Handler):
def get(self):
self.render("signup-form.html")
def post(self):
have_error = False
self.username = self.request.get('username')
self.password = self.request.get('password')
self.verify = self.request.get('verify')
self.email = self.request.get('email')
params = dict(username = self.username,
email = self.email)
if not valid_username(self.username):
params['error_username'] = "That's not a valid username."
have_error = True
if not valid_password(self.password):
params['error_password'] = "That wasn't a valid password."
have_error = True
elif self.password != self.verify:
params['error_verify'] = "Your passwords didn't match."
have_error = True
if not valid_email(self.email):
params['error_email'] = "That's not a valid email."
have_error = True
if have_error:
self.render('signup-form.html', **params)
else:
self.done()
def done(self, *a, **kw):
raise NotImplementedError
class Register(Signup):
def done(self):
#make sure the user doesn't already exist
u = User.by_name(self.username)
if u:
msg = 'That user already exists.'
self.render('signup-form.html', error_username = msg)
else:
u = User.register(self.username, self.password, self.email)
u.put()
self.login(u)
self.redirect('/')
class Login(Handler):
def get(self):
self.render('login-form.html')
def post(self):
username = self.request.get('username')
password = self.request.get('password')
u = User.login(username, password)
if u:
self.login(u)
frontuser = username
self.render('home.html', frontuser = frontuser)
else:
msg = 'Invalid login'
self.render('login-form.html', error = msg)
class Logout(Handler):
def get(self):
self.logout()
self.redirect('/')
class MP(Handler):
def get(self):
self.render('mp.html')
class FileUpload(Handler):
def post(self):
file_upload = self.request.POST.get("file", None)
file_name = file_upload.filename
image = Images(id=file_name, file_name=file_name, blob=file_upload.file.read())
image.put()
self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0]
self.response.write(image.blob)
class ImgServe(Handler):
def get(self, resource):
image = ndb.Key('Images', resource).get()
self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0]
self.response.write(image.blob)
class Blob(Handler):
def get(self):
self.render("blob.html")
class Template(Handler):
def get(self):
self.render('template.html')
app = webapp2.WSGIApplication([('/', MainPage),
('/signup', Register),
('/login', Login),
('/logout', Logout),
('/mp', MP),
(r'/file_upload', FileUpload),
('/blob', Blob),
(r'/img_serve/<resource:(.*)>', ImgServe),
('/template', Template)], debug=True)
blob.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Image Upload</title>
</head>
<body>
<form action="/file_upload" enctype="multipart/form-data" method="post">
<div><input type="file" name="file"/></div>
<div><input type="submit" value="Upload"></div>
</form>
</body>
</html>
template.html
<html>
<head>
<title>Template</title>
</head>
<body>
<img src="/img_serve/database.jpeg" />
</body>
</html>
此外,这是我得到的而不是图像:
答案 0 :(得分:0)
使用App引擎SDK 1.9.0和Python 27,在使用您的上传代码和file_name:clock.png上传图像后,SDK数据存储应该如下所示:
在您的代码中:class FileUpload(Handler)
和class ImgServe(Handler):
但为什么不使用webapp2.RequestHandler for Handler?
使用此静态HTML:
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Image Serving</title>
</head>
<body>
<img src="/img_serve/clock.png" alt="clock" >
</body>
</html>
这个处理程序:
class ImgServe(webapp2.RequestHandler):
def get(self, resource):
image = ndb.Key('Images', resource).get()
self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0]
self.response.write(image.blob)
路由:
webapp2.Route(r'/img_serve/<resource:(.*)>', handler=....ImgServe)
答案 1 :(得分:0)
我建议您使用Blobstore存储图像 - 它更便宜,并且专门针对此目的进行了优化。
更好的是,您可以将图像存储在Google云端存储中。它甚至比Blobstore便宜。
这两种解决方案都有额外的好处 - 浏览器可以缓存这些图像。