Как отправить ключ в JavaScript?

#python #google-app-engine

#python #google-app-engine

Вопрос:

Я хочу отправить src-файл изображения в браузер с помощью AJAX.

На стороне сервера:

 que = db.Query(Imageitem).order('-created')
item_list = que.fetch(limit=1)
if(len(item_list)>0):
    itemkey = {'imgid':item_list[0].key()}
else:
    itemkey = {'imgid':''}
json_itemkey = gaejsonEncoder.encode(itemkey)
  

Шаблон на стороне клиента:

 <img src='img?img_id=$(.imgid)'></img>
  

Я использую SNBinder для привязки на стороне клиента, а $(.imgid) означает itemkey[0].imgid.

Но это ошибка.

 datastore_types.Key.from_path(u'Imageitem', 515L, _app=u'fileshare')
is not JSON serializable
  

Есть ли какой-либо способ отправить ключ для объекта хранилища данных на сторону клиента?

Любой совет с благодарностью.

Ответ №1:

Если вы хотите закодировать ключевой элемент в формате JSON, просто используйте строковую версию ключа, передав ключ в str():

 itemkey = {'imgid': str(item_list[0].key())}
  

Комментарии:

1. Спасибо. Есть ли какой-либо способ преобразовать строку в ключ?

2. Почти уверен, что все методы, которые ожидают ключевой объект, также принимают версию string .

3. imgitem = db.get(self.request.get(«img_id»)). Это ошибка; BadKeyError: недопустимый строковый ключ не определен ===. Как я могу использовать «img_id»? Извините.

4. @Yugo Kamo, вы можете использовать ImageModel.get_by_id(img_id) или db.get(db.Key.from_path(‘ImageModel’,img_id))

5. Если вы используете метод @can, вам нужно будет использовать item_list[0].key().id() в JSON

Ответ №2:

В моем случае мне не нужен был ключ, поэтому я использовал класс, расширенный из json.JSONEncoder, чтобы перехватить ключевые экземпляры упомянутой db.Model.

 import json
from datetime import datetime
from google.appengine.ext.db import Key

class ComplexEncoder(json.JSONEncoder):
    def default(self,obj):
        if isinstance(obj,datetime):
            return obj.isoformat()
        if isinstance(obj,Key):
            return ''
        return json.JSONEncoder.default(self,obj)