Question

Bon après-midi,

J'essaie actuellement de créer quelque chose d'incroyablement simple dans Google AppEngine. L'objectif est de créer une application de partage de photos simple qui se reconnectera à mon application iPhone. C'est une expérience d'apprentissage à la fois pour Python et Objective-C.

(Je suis programmeur PHP depuis un certain temps).

L'objectif, créez des URL ressemblant à ceci: / img / {{model.key.id}}

Le problème est que, peu importe la façon dont je réalise le script python, je finis par obtenir une erreur ou je ne vois simplement rien à afficher sur la page de modèle qui est encapsulée dans l'instruction FOR.

Mon fichier App.yaml:

application: randomwebappname
version: 1
runtime: python
api_version: 1

handlers:
- url: /media
  static_dir: media

- url: /b/.*
  script: beta.py
  login: required

- url: /.*
  script: main.py

Mon modèle (dans la version bêta.py):

class Photo(db.Model):
    author = db.StringProperty()
    title = db.StringProperty()
    slugline = db.StringProperty()
    content = db.StringProperty(multiline=True)
    coordinates = db.StringProperty()
    avatar = db.BlobProperty()
    date = db.DateTimeProperty(auto_now_add=True)

Mon cours pour l'affichage de la page d'image:

class ViewPage(webapp.RequestHandler):
def get(self, id):


template_values = {
    'image': image,
}

path = os.path.join(os.path.dirname(__file__), 'templates/view.html')
self.response.out.write(template.render(path, template_values))

J'ai essayé toutes les solutions suivantes dans ma classe, mais elles ont toutes abouti à un échec. Je les ai essayés avec key, key.name et key.id dans l'URL:

photos = db.Query(Photo).filter('key', slug).fetch(limit=1)

photos = Photo.get_by_key_name(id)

photos = Photo.get_by_key_name(key)

key = db.Key.from_path('Photo', id) 

photos = db.GqlQuery("SELECT * FROM Photo WHERE __key__ = :key", key=key)

photos = db.get(photo_key)

photos = self.request.get("id")

Mes URL:

application = webapp.WSGIApplication([
    ('/b/', HomePage),
    ('/b/upload', UploadPage),
    ('/b/add', MainPage),
    ('/b/img', Image),
    ('/b/img/([-\w]+)', ViewPage),
    ('/b/submit', Submission)
], debug=True)

La requête de modèle:

{% for photo in photos %}
<img alt="" title="" src="img?img_id={{ photo.key }}" alt="main image" />
{% endfor %}

Cela semble être quelque chose d’incroyablement simple et je sais que quelque chose me manque, mais je ne sais pas trop où il en est. J'écrirais ceci en PHP, mais j'aime bien le concept d'AppEngine et je l'ai déjà dit, c'est une bonne expérience d'apprentissage Python.

Remarque: cette application fonctionne sur la page d'accueil du site. J'ai simplement une requête GQL et les images sont correctes. Cela échoue lorsque j'essaie d'accéder aux pages / img / id.

Des conseils les gars (et les filles)? Merci d'avance!

MISE À JOUR N ° 1 :
Conformément à la demande de Jonathan, voici la classe Image:

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

De plus, après avoir posté ceci, j’ai réalisé que c’était une partie du problème car j’essayais de faire / img en tant qu’image réelle et / img / d’afficher la page de vue. Depuis, j'ai changé cela et j'ai maintenant un modèle de travail. Mais c'est basé sur la clé et non sur key.id:

URL:

('/b/i', ViewPage)

Nouvelle classe ViewPage:

class ViewPage(webapp.RequestHandler):
    def get(self):
    image = db.get(self.request.get("id"))  

    template_values = {
        'image': image,
    }

    path = os.path.join(os.path.dirname(__file__), 'templates/view.html')
    self.response.out.write(template.render(path, template_values))

Donc ... pour accéder à la page Afficher (qui inclut des commentaires, etc.), vous devez maintenant accéder à l'URL suivante: / b / i? img_id = {{image.key}}

Au moins la page fonctionne-t-elle maintenant, mais je préférerais de beaucoup que la page ressemble à ce qui suit, comme indiqué ci-dessus: / b / img / {{image.key.id}}

Mise à jour 2: la classe ViewPage a été mise à jour, ainsi que les URL:

class ViewPageV2(webapp.RequestHandler):
    def get(self, id):
    images = [ db.get(id) ]

    template_values = {
        'image': image,
    }

    path = os.path.join(os.path.dirname(__file__), 'templates/view.html')
    self.response.out.write(template.render(path, template_values))

Nouvelle URL:     ('/ b / image / ([- \ w] +)', ViewPageV2),

Vous trouverez ci-dessous deux captures d'écran, l'une d'entre elles étant la preuve de l'identité "1". existant et l'erreur qui vient avec elle actuellement.

texte alternatif http://img215.imageshack.us/img215/9123/screenshot20091130at937 .png

texte alternatif http://img215.imageshack.us/img215/2207/screenshot20091130at938 .png

Encore merci à tous!

Était-ce utile?

La solution

Un moyen simple de toutes les saisir:

photos = Photo.gql('ORDER BY __key__')

Pour plus d'informations, voir Requêtes sur des clés dans les documents App Engine.

Stockez-vous vos photos avec des clés prédéfinies ?

photo = Photo(key_name="xzy123")
photo.put()

Ensuite, vous pouvez le récupérer dans votre ViewPage:

photos = [ Photo(key_name="%s" % id) ]

Voir Obtenir une entité à l'aide d'une clé .

Enfin, pour récupérer une photo en fonction de sa clé attribuée au moteur d’application et en supposant que cette clé soit présente dans l’URL ( par exemple , http: // hôte / b / img / ahByY. .. , modifiez donc votre modèle pour générer des URL de ce formulaire), utilisez

class ViewPage(webapp.RequestHandler):
  def get(self, id):
    photos = [ db.get(id) ]
    ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top