Как вывести изображение из магазина? - PullRequest
2 голосов
/ 04 декабря 2010

Я пытаюсь понять документацию Используя Изображения Python API , и я не понимаю, как получить ключ и отобразить аватар.

Документация говорит, что обработчик Image будет обслуживать изображение вне пути /img.

Я не совсем понимаю, что делает этот обработчик Image. Я комментирую ниже, как это понять; пожалуйста исправьте. Спасибо:

class Image (webapp.RequestHandler):
    def get(self):
        #get the key of the image "img_id" from datastore
        #what is the value of "img_id"? Where does it come from?
        #how does the app engine know to get what key for which image?
        greeting = db.get(self.request.get("img_id"))
        #what is greeting.avatar?
        #is it img_id.avatar ?
        #I assume "avatar" refers to the "avatar" property in the model
        if greeting.avatar:
            self.response.headers['Content-Type'] = "image/png"
            #does this display the avatar?
            #I thought the img tag displayed the avatar
            self.response.out.write(greeting.avatar)
       else:
          self.error(404)

Большое спасибо за вашу помощь.


ОБНОВЛЕНИЕ (re: answer by Gabi Purcaru)

Еще раз спасибо за четкий ответ. У меня есть запрос, который отображает комментарии пользователей, как это:

    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("</li>")
    self.response.out.write("</ol></body></html>")

Итак, я копирую строку с тегом изображения из обработчика MainPage

self.response.out.write("<div><img src='img?img_id=%s'></img>" % greeting.key())

и изменить

greeting.key()

до

result.key()

Я предполагаю, что теперь это должно отображать аватар рядом с комментарием пользователя:

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

но все еще не ясно, почему result.key() является ключом изображения, которое я хочу отобразить?

1 Ответ

3 голосов
/ 04 декабря 2010
  1. "img_id" происходит из части URL GET (что-то вроде «www.example.com/img?img_id=12312»). Двигатель назначает новый уникальный ключ для каждой модели в базе данных.

  2. greeting.avatar - свойство аватара модели с ключом img_id. Так что, в некотором смысле, вы можете думать об этом как img_id.avatar, хотя технически это не правильно.

  3. , который не отображает аватар, он просто возвращает аватар. Давайте возьмем обычное изображение, например, чтобы вы лучше поняли. Когда вы пишете <img src="some_link" />, браузер будет искать "some_link" и включать это изображение. Затем браузер прочитает изображение из файловой системы и вернет его браузеру. Ваш обработчик изменяет внутреннюю часть, так что веб-сервер будет возвращать изображение из хранилища данных (в частности, это свойство avatar) вместо обычного файла. Браузер и пользователь увидят его как обычное изображение.

EDIT: result.key() - это уникальный идентификатор, который база данных автоматически предоставила вашей модели. Вам нужно «сообщить об этом» обработчику изображений, который вы только что написали, чтобы он знал, какая именно модель аватара вам нужна. Вы делаете это, устанавливая переменную img_id GET для URL (который вы только что сделали).

Я не уверен, что вы все поняли .key(). Позвольте мне объяснить, что:

Любая база данных должна идентифицировать одну запись из другой (модель в нашем случае). Вот почему они автоматически назначат новый и, что наиболее важно, уникальный идентификатор (в нашем случае это ключ) для каждой записи, вставленной в базу данных. Вы должны будете предоставить ключ модели для вашего обработчика, чтобы вернуть аватар этой модели.

Давайте рассмотрим пример из реального мира: вы среди многих людей. Вашу страну однозначно идентифицируют по номеру SSN (номер социального страхования). В моей стране это 13-значный код (например, 1024582485008). Если я хочу получить водительские права, мне нужно будет указать свое имя, но этого недостаточно - я не единственный Габи Пуркару в моей стране. Я также должен предоставить свой SSN, который точно скажет , кто я . Если мы проведем аналогию, вы должны предоставить обработчику «SSN» модели (т. Е. Ключ), чтобы он знал , какую модель получить из базы данных и вернуть ее аватар.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...