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