【发布时间】:2014-06-04 02:54:37
【问题描述】:
我正在尝试使用端点来更新我的数据存储中的一些 JSON 值。我在 GAE 中有以下数据存储...
class UsersList(ndb.Model):
UserID = ndb.StringProperty(required=True)
ArticlesRead = ndb.JsonProperty()
ArticlesPush = ndb.JsonProperty()
一般来说,我尝试使用 API 的方法是让该方法接收用户 ID 和读取的文章列表(文章由包含 ID 的字典和布尔字段表示用户是否喜欢这篇文章)。我的信息(以这个逻辑为中心)如下...
class UserID(messages.Message):
id = messages.StringField(1, required=True)
class Articles(messages.Message):
id = messages.StringField(1, required=True)
userLiked = messages.BooleanField(2, required=True)
class UserIDAndArticles(messages.Message):
id = messages.StringField(1, required=True)
items = messages.MessageField(Articles, 2, repeated=True)
class ArticleList(messages.Message):
items = messages.MessageField(Articles, 1, repeated=True)
我尝试进行此更新的 API/Endpoint 方法如下...
@endpoints.method(UserIDAndArticles, ArticleList,
name='user.update',
path='update',
http_method='GET')
def get_update(self, request):
userID = request.id
articleList = request.items
queryResult = UsersList.query(UsersList.UserID == userID)
currentList = []
#This query always returns only one result back, and this for loop is the only way
# I could figure out how to access the query results.
for thing in queryResult:
currentList = json.loads(thing.ArticlesRead)
for item in articleList:
currentList.append(item)
for blah in queryResult:
blah.ArticlesRead = json.dumps(currentList)
blah.put()
for thisThing in queryResult:
pushList = json.loads(thisThing.ArticlesPush)
return ArticleList(items = pushList)
这段代码有两个问题。首先是我似乎无法弄清楚(使用 localhost Google APIs Explorer)如何使用我的 UserIDAndArticles 类将文章列表发送到端点方法。是否可以将 messages.MessageField() 作为端点方法的输入?
另一个问题是我在“blah.ArticlesRead = json.dumps(currentList)”行中遇到错误。当我尝试使用一些随机输入运行此方法时,出现以下错误...
TypeError: <Articles
id: u'hi'
userLiked: False> is not JSON serializable
我知道我必须制作自己的 JSON 编码器来解决这个问题,但我不确定传入 request.items 的格式是什么以及我应该如何对其进行编码。
我是 GAE 和端点(以及一般这种服务器端编程)的新手,所以请多多包涵。并提前非常感谢您的帮助。
【问题讨论】:
标签: python json google-app-engine google-cloud-datastore google-cloud-endpoints