1

Может ли кто-нибудь проверить/исправить мой метод доступа к изображению, которое является частью класса ndb.Model?Извлечение изображения из Google App Engine ndb

Это мой MainPage обработчик:

class MainPage(webapp2.RequestHandler): 

def get(self): 
    guestbook_name = self.request.get('guestbook_name', 
             DEFAULT_GUESTBOOK_NAME) 
    greetings_query = Greeting.query(
     ancestor=guestbook_key(guestbook_name)).order(-Greeting.date) 
    greetings = greetings_query.fetch(10) 

    template_values = { 
     'greetings': greetings, 
     'guestbook_name': urllib.quote_plus(guestbook_name), 
    } 

    template = JINJA_ENVIRONMENT.get_template('index.html') 
    self.response.write(template.render(template_values)) 

Это мой index.html код шаблона:

{% for greeting in greetings %} 
    <div><img src="/img?key_id={{ greeting.key.id() }}" /> 
    </div> 
{% endfor %} 

Это мой обработчик изображений:

class Image(webapp2.RequestHandler): 
def get(self): 
    greeting = ndb.get(self.request.get('key_id')) 
    if greeting.avatar: 
     self.response.headers['Content-Type'] = 'image/png' 
     self.response.out.write(greeting.avatar) 
     self.response.write('it works') 
    else: 
     self.error(404) 
     self.response.out.write('No image') 

Идея заключается в том, что Я сохраняю свое изображение в блобе в моей модели приветствия NDB. Затем я пытаюсь получить это изображение, заполнив основную страницу обработчиком MainPage, который вызывает мой обработчик изображения. Я передаю конкретный ключ доступа ndb через мой шаблон, а затем извлекаю ключ из шаблона в обработчике изображения. Затем я пытаюсь отобразить атрибут blob, получив запись ndb с помощью ключа. Вот след ошибка:

enter image description here

+0

использования https://webapp-improved.appspot.com/ guide/request.html # get-data: self.request.GET ('key_id')) – voscausa

ответ

3

Ваш способ загрузки данных не/не может работать, Вы писали:

greeting = ndb.get(self.request.get('key_id')) 

Как исключение указывает, модуль (ndb) имеет no get, и даже если бы он был, как он мог узнать модель, которую нужно искать? Правильный способ сделать это было бы:

greeting_id = int(self.request.get('key_id')) 
greeting = Greeting.get_by_id(greeting_id) 

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

Кроме того, правильный метод для написания ответа заключается в следующем:

self.response.write(greeting.avatar) 

Как вы можете прочитать here in the docs. Использование out «устарело» (из старой структуры), поддерживается только в целях совместимости и, в конечном счете, одно и то же, поэтому, дважды записывая его, вы эффективно искажаете свои данные изображения.

Если вы хотите отладочную информацию следует использовать более подходящий метод:

import logging 
logging.info('it works') 

Решение комментарии ниже:

guestbook_name = self.request.get('guestbook_name', DEFAULT_GUESTBOOK_NAME) 
greeting_id = int(self.request.get('key_id')) 
greeting = Greeting.get_by_id(greeting_id, parent=guestbook_key(guestbook_name)) 
+0

Спасибо! Хотя сейчас я получаю другую ошибку, говоря, что «приветствие» - это объект NoneType. Я храню это неправильно или что-то в этом роде? Я чувствую, что я действительно близок ... Из локального хранилища данных я вижу, что загруженное изображение хранится как двоичный файл, который, как я предполагаю, означает, что загрузка выполнена. Осталось только получить это. Почему я извлекаю объект, который является None? – Sticky

+0

Я вижу, что вы используете предка для запроса своих приветствий, поэтому вам может понадобиться использовать его при их получении, например: 'Greeting.get_by_id (greeting_id, parent = guestbook_key)' –

+1

Спасибо! Это сработало. Вместо этого я отправлю решение для ответа. – Sticky

Смежные вопросы