URL dinámicas dentro del AppEngine de Google
-
08-07-2019 - |
Pregunta
Buenas tardes
Actualmente estoy tratando de construir algo increíblemente simple dentro del Google AppEngine. El objetivo es crear una aplicación sencilla para compartir fotos que se conecte de nuevo a la aplicación de mi iPhone. Todo es una experiencia de aprendizaje tanto para Python como para Objective-C.
(He sido programador de PHP durante bastante tiempo).
El objetivo, crear URL que tengan el siguiente aspecto: / img / {{model.key.id}}
El problema es que parece que no importa cómo hago el script de Python, termino con un error o simplemente no obtengo nada que mostrar en mi página de plantilla que está envuelta en la declaración FOR.
Mi archivo 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
Mi modelo (dentro de beta.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)
Mi clase para ver la página de imágenes:
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))
Intenté todo lo siguiente en mi clase, pero todos terminaron en fracaso. Los probé con key, key.name y key.id en la 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")
Mis 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 consulta de plantilla:
{% for photo in photos %}
<img alt="" title="" src="img?img_id={{ photo.key }}" alt="main image" />
{% endfor %}
Parece que sería algo increíblemente simple y sé que me falta algo, pero no estoy seguro de dónde está. Escribiría esto en PHP, pero me gusta el concepto de AppEngine y como dije anteriormente, es una buena experiencia de aprendizaje de Python.
Como nota al margen, esta aplicación funciona en la página de inicio del sitio. Simplemente tengo una consulta GQL y las imágenes salen bien, simplemente falla cuando intento ir a las páginas / img / id.
¿Algún consejo chicos (y chicas)? Gracias de antemano!
ACTUALIZACIÓN # 1 :
Según la solicitud de Jonathan, la siguiente es la clase de imagen:
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")
Además, después de publicar esto, me di cuenta de que esto era parte del problema, ya que estaba tratando de hacer / img como la imagen real y / img / para mostrar la página de visualización. Desde entonces he cambiado esto y ahora tengo un modelo de trabajo. Pero se basa en la clave y no en key.id:
URL:
('/b/i', ViewPage)
Nueva clase de 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))
Entonces ... para acceder a la página Ver (que incluye comentarios y demás), ahora debe ir a la siguiente URL: / b / i? img_id = {{image.key}}
Al menos la página está funcionando ahora, pero preferiría que la página se parezca a la siguiente, como se indicó anteriormente: / b / img / {{image.key.id}}
Actualización # 2: clase ViewPage actualizada, así como URL's:
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))
Nueva URL: ('/ b / image / ([- \ w] +)', ViewPageV2),
Las siguientes son dos capturas de pantalla, una de ellas es la prueba de id " 1 " existente y el error que viene con él actualmente.
alt text http://img215.imageshack.us/img215/9123/screenshot20091130at937 .png
alt text http://img215.imageshack.us/img215/2207/screenshot20091130at938 .png
Nuevamente, ¡Gracias a todos!
Solución
Una forma sencilla de capturarlos a todos:
photos = Photo.gql('ORDER BY __key__')
Para obtener más información, consulte Consultas en claves en los documentos de App Engine.
¿Está almacenando sus fotos con claves predefinidas ?
photo = Photo(key_name="xzy123")
photo.put()
Entonces puede recuperarlo en su ViewPage:
photos = [ Photo(key_name="%s" % id) ]
Consulte Obtención de una entidad utilizando una clave .
Finalmente, para recuperar una foto basada en su clave asignada por un motor y suponiendo que esta clave esté presente en la URL ( por ejemplo , http: // host / b / img / ahByY. ..
, así que cambie su plantilla para generar URL de este formulario), use
class ViewPage(webapp.RequestHandler):
def get(self, id):
photos = [ db.get(id) ]
...