【问题标题】:Getting Objects with urllib2使用 urllib2 获取对象
【发布时间】:2013-06-26 20:41:54
【问题描述】:

我有两个 GAE 应用程序协同工作。一个在数据库中保存一个对象,另一个从第一个应用程序中获取该对象。下面我有一些代码,其中要求第一个应用程序并提供 Critter 对象。我正在尝试通过 urllib2 访问第一个应用程序的对象,这真的可能吗?我知道它可以用于 json 但它可以用于对象吗?

仅出于某种原因,我将其开发为一个班级项目。学生将学习如何通过创建他们的小动物来托管 GAE 应用程序。然后他们会给我他们的小动物的网址,我的应用程序将使用这些网址收集他们所有的小动物,然后将它们放入我的应用程序的世界中。

我最近才听说泡菜,还没有研究过,那可能是更好的选择吗?

critter.py:

class Access(webapp2.RequestHandler):
    def get(self):
        creature = CritStore.all().order('-date').get()
        if creature:
            stats = loads(creature.stats)
            return SampleCritter(stats)
        else:
            return SampleCritter() 

map.py:

class Out(webapp2.RequestHandler):
    def post(self):
        url = self.request.POST['url']#from a simple html textbox
        critter = urllib2.urlopen(url)
        ...work with critter as if it were the critter object...

【问题讨论】:

  • 如果您有两个独立的 appengine 应用程序使用相同的数据,您很可能违反了条款和条件。其次,如果您想从不同的数据存储中获取数据存储实体,您始终可以使用云数据存储。
  • 如何访问云数据存储中的信息?

标签: python google-app-engine get urllib2


【解决方案1】:

是的,你可以使用泡菜。

这是一些传输实体的示例代码,包括密钥:

entity_dict = entity.to_dict() # First create a dict of the NDB entity
entity_dict['entity_ndb_key_safe'] = entity.key.urlsafe() # add the key of the entity to the dict
pickled_data = pickle.dumps(entity_dict, 1) # serialize the object
encoded_data = base64.b64encode(pickled_data) # encode it for safe transfer

作为 urllib2 的替代方案,您可以使用 GAE urlfetch.fetch()

在请求的应用程序中,您可以:

entity_dict = pickle.loads(base64.b64decode(encoded_data)) 

【讨论】:

  • 很抱歉,我只是在学习 GAE,所以我完全不知道这里发生了什么。能否请您详细说明。这里的实体是什么意思?为什么我需要钥匙? base64.b64encode(pickled_data) 在做什么?
  • 我建议您遵循 python 入门:developers.google.com/appengine/docs/python/…,您会找到该实体。维基百科:当需要对需要通过旨在处理文本数据的媒体传输的二进制数据进行编码时,通常使用 Base64 编码方案。这是为了确保数据在传输过程中保持完好无损。
  • 如果您不介意,还有 2 个问题,因为这很有趣。 .to_dict() 会处理这些功能吗?例如,如果我的实体有一个 move() 函数,其中 x 和 y 将被添加到,那会被保留吗?其次,为什么关键很重要,为什么它必须是 urlsafe()?
  • 否,to_dict 制作实体属性的字典。 Pickle 将序列化对象。如果您不需要密钥:跳过密钥和 to_dict。 urlsafe 意味着:您可以将它们 urlsafe_key 用作 url 的一部分:例如:“example.com/this is not an url safe key”,因为它有空格。
猜你喜欢
  • 1970-01-01
  • 2016-06-23
  • 2018-02-04
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多