2010-12-04 4 views
1

MISE À JOUR:Comment écrire une image dans le magasin de données?

Voir le commentaire par systempuntoout. Le formulaire ne contenait pas le bouton de soumission. Maintenant tout fonctionne.


J'ai ce code que je pense écrirait une image à datastore; mais ce n'est pas happenning:

class AvatarSave(webapp.RequestHandler): 
    def post(self): 
     q = User.all() 
     q.filter("userEmail =", "[email protected]") 
     qTable = q.fetch(10) 
     if qTable: 
      for row in qTable: 
       avatar = images.resize(self.request.get("img"), 32, 32) 
       row.avatar = db.Blob(avatar) 
       db.put(qTable) 
     else: 
      self.response.out.write("user not found") 

     self.redirect('/') 

Le journal affiche la clé de l'image:

INFO  2010-12-04 13:56:26,601 dev_appserver.py:3317] "GET /img? 
img_id=ag1oZWxsby0xLXdvcmxkcgsLEgRVc2VyGIABDA HTTP/1.1" 200 - 

Mais rien ne s'affiche, sauf le lien brisé. Qu'est-ce que j'oublie ici? J'apprécierais votre aide. J'inclus le script entier ci-dessous. Merci!

class MainPage(webapp.RequestHandler): 
    def get(self): 
     siteUser = users.get_current_user() 
     greeting = None   
     if siteUser: 
      greeting = ("Welcome, %s! (<a href=\"%s\">sign out</a>)" % 
        (siteUser.nickname(), users.create_logout_url("/"))) 
     else: 
      greeting = ("<a href=\"%s\">Sign in or register</a>" % 
        users.create_login_url("/")) 

     self.response.out.write(greeting)    

     self.response.out.write(""" 
      <form action="/avatar-save" enctype="multipart/form-data" method="post">     
      <div><label>Avatar:</label></div> 
      <div><input type="file" name="img"/></div> 
      </form> 
     </body> 
     </html>""") 

     query = User.all() 
     query.filter("userEmail =", "[email protected]") 
     query.order("-userScore") 
     results = query.fetch(10) 
     self.response.out.write("""<html><head><style> 
           body {font-size: small; 
            font-family: Verdana, Helvetica, sans-serif; 
            }</style> 
            </head><body><ol>""") 
     for result in results: 
      self.response.out.write("<li>") 
      self.response.out.write("<b>%s</b> %s " % (result.userName, result.userLatestComment)) 
      self.response.out.write("<div><img src='img?img_id=%s'></img>" % result.key()) 
      self.response.out.write("</li>") 
     self.response.out.write("</ol></body></html>") 

class Image (webapp.RequestHandler): 
    def get(self): 
     greeting = db.get(self.request.get("img_id")) 
     if greeting.avatar: 
      self.response.headers['Content-Type'] = "image/png" 
      self.response.out.write(greeting.avatar) 
     else: 
      self.response.out.write("No image") 

class AvatarSave(webapp.RequestHandler): 
    def post(self): 
     q = User.all() 
     q.filter("userEmail =", "[email protected]") 
     qTable = q.fetch(10) 
     if qTable: 
      for row in qTable: 
       avatar = images.resize(self.request.get("img"), 32, 32) 
       row.avatar = db.Blob(avatar) 
       db.put(qTable) 
     else: 
      self.response.out.write("user not found") 

     self.redirect('/') 

application = webapp.WSGIApplication(
            [('/', MainPage), 
             ('/img', Image), 
             ('/avatar-save', AvatarSave),          
             ], 
            debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

Répondre

3

Je pense que votre code manque le bouton d'envoi sur la soumission du formulaire d'image:

self.response.out.write(""" 
      <form action="/avatar-save" enctype="multipart/form-data" method="post">     
      <div><label>Avatar:</label></div> 
      <div><input type="file" name="img"/></div> 
      <input type="submit"/> 
      </form>... 

J'ai essayé votre code déduisant le modèle User que vous avez pas signalé dans la question:

Puisque votre code ne contient pas la partie de création de l'utilisateur, j'ai créé un utilisateur à partir de zéro de la console interactive de développement avec:
from main import User 
User(userEmail='[email protected]', userScore=1).put() 

puis, je me suis connecté avec [email protected] et j'ai téléchargé l'image.

Ceci est le résultat:
alt text

Tout ce que je peux dire est "il fonctionne sur ma machine".

+3

Bonjour systempuntoout: Merci d'avoir pris le temps d'aider! J'ai vraiment apprécié. Maintenant ça marche aussi sur ma machine! – Zeynel

+1

@Zeynel vous êtes les bienvenus; Vérifiez également le gestionnaire MainPage, vous fermez l'étiquette deux fois. – systempuntoout

Questions connexes