Динамический URL-адрес находится внутри приложения Google

StackOverflow https://stackoverflow.com/questions/1816529

Вопрос

Добрый день,

В настоящее время я пытаюсь создать что-то невероятно простое внутри Google AppEngine.Цель состоит в том, чтобы создать простое приложение для обмена фотографиями, которое будет подключаться обратно к приложению my iPhone.Это все для обучения как Python, так и Objective-C.

(Я уже довольно давно работаю PHP-программистом).

Цель - создать URL-адреса, которые выглядят следующим образом:/img/{{ model.key.id }}

Проблема в том, что, похоже, независимо от того, как я выполняю скрипт на python, я либо выдаю ошибку, либо просто не получаю ничего для отображения на странице моего шаблона, заключенного в инструкцию FOR .

Мой файл 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

Моя модель (внутри 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)

Мой Класс для просмотра страницы с изображением:

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))

Я перепробовал все нижеперечисленное на своем занятии, но все они закончились неудачей.Я пробовал их с помощью key, key.name и key.идентификатор в 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")

Мой URL-адрес:

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

Шаблонный запрос:

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

Кажется, что это было бы что-то невероятно простое, и я знаю, что мне чего-то не хватает, но я просто не уверен, где это находится.Я бы написал это на PHP, но мне нравится концепция AppEngine, и я уже говорил выше, что это хороший опыт изучения Python.

В качестве дополнительного примечания, это приложение действительно работает на главной странице сайта.У меня просто есть запрос GQL, и он нормально выводит изображения, он просто терпит неудачу, когда я пытаюсь перейти на страницы / img / id.

Есть какие-нибудь советы парням (и девушкам)?Заранее спасибо!

ОБНОВЛЕНИЕ №1:
Согласно запросу Джонатана, ниже приведен класс 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")

Кроме того, после публикации этого я понял, что это было частью проблемы, поскольку я пытался использовать /img в качестве фактического изображения и /img / для отображения страницы просмотра.С тех пор я изменил это, и теперь у меня есть рабочая модель.Но это основано на Ключе, а не key.id:

URL- АДРЕС:

('/b/i', ViewPage)

Новый класс 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))

Итак...чтобы перейти на страницу Просмотра (которая включает комментарии и тому подобное), теперь вам нужно перейти по следующему URL:/b/ i?img_id={{ image.key }}

По крайней мере, сейчас страница работает, но я бы предпочел, чтобы страница выглядела следующим образом, как указано выше:/b/img/{{ image.key.id }}

Обновление №2:Обновлен класс ViewPage, а также 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))

Новый URL-адрес:('/b/image/([-\w]+)', страница просмотра 2),

Ниже приведены два скриншота, один из которых является доказательством существования идентификатора "1" и ошибки, которая возникает с ним в данный момент.

альтернативный текст http://img215.imageshack.us/img215/9123/screenshot20091130at937.png

альтернативный текст http://img215.imageshack.us/img215/2207/screenshot20091130at938.png

Еще раз всем спасибо!

Это было полезно?

Решение

Простой способ захватить их все:

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

Подробнее см. Запросы по ключам в документах App Engine.

Вы храните свои фотографии с предопределенными ключами?

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

Затем вы можете получить его на своей странице просмотра:

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

Видишь Получение объекта с помощью ключа.

Наконец, чтобы получить фотографию на основе назначенного ей appengine ключа и предполагая, что этот ключ присутствует в URL(например ,, http://host/b/img/ahByY..., поэтому измените свой шаблон, чтобы генерировать URL-адреса этой формы), используйте

class ViewPage(webapp.RequestHandler):
  def get(self, id):
    photos = [ db.get(id) ]
    ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top