【问题标题】:Return JSON from a Python Class to Another Class将 JSON 从 Python 类返回到另一个类
【发布时间】:2026-02-07 16:25:01
【问题描述】:

我如何将完全相同的 JSON 数据从一个类返回到另一个类?

代码:

class Class1(webapp.RequestHandler):
    def get(self):
        random_id = str(uuid.uuid1())
        time_now = int(time.time())
        info = {
            id: random_id,
            now: time_now
        }

       json_info = json.dumps(info)
       print json_info
       self.response.write(info)

class Class2(webapp.RequestHandler):
    def get(self):
        getting_info = self.Class1()
        getting_info_time = getting_info['now']
        print getting_info_time

错误:

class1_info = self.Class1()

AttributeError: 'Class2' 对象没有属性 'Class1'


编辑(更多细节):

我的应用程序的一部分需要 整个 JSON 输出,而另一部分只需要 info 字典中的 now 值。并且这两个类都将使用 info 字典中的相同 exact 数据。

我一直在尝试获取 now 输出,但只收到错误消息。


尝试:

注意:使用@Alex 的回答(带有@snakecharmerb 推荐的memcache)

代码:

from google.appengine.api import memcache 

class Class1(webapp.RequestHandler):
    def generate_data(self):
        random_id = str(uuid.uuid1())
        time_now = int(time.time()))

        id_cached = memcache.add(key=random_id, value=random_id, time=600)
        get_id_cached = memcache.get(key=random_id, value=random_id, time=600)

        time_cached = memcache.add(key=time_now, value=time_now, time=600)
        get_time_cached = memcache(key=time_now)

        info = {
            id: get_id_cached,
            now: get_time_cached
        }

       json_info = json.dumps(info)
       return json_info

    def get(self):
        self.response.write(generate_data())

class Class2(webapp.RequestHandler):
    def get(self):
        getting_info = Class1().generate_data()
        print getting_info

结果:

{“id”:“9d752605-a20d-11e7-8bfd-bfe81b332704”,“时间”:“1506356501”}

{“id”:“9b95e899-a20d-11e7-b137-bfe81b332704”,“时间”:“1506356498”}

【问题讨论】:

  • 欢迎使用依赖注入!您必须将 Class1 对象传递给 Class2 或简单地从 Class1.get 返回json_info,然后以某种方式将其传递给 Class2.get。您的消息说 Class2 没有属于 Class1 的成员
  • 感谢您的指导
  • 你实际上可以实现 Class2 的__init__ 方法然后有类似self.cls1 = Class1 ()的东西
  • 我的应用程序的一部分需要 whole JSON 输出,而另一部分只需要 info 字典中的 now 值。我一直在尝试获取 now 输出,但我只收到错误消息。

标签: python json google-app-engine


【解决方案1】:

这将有助于更多地了解您正在尝试做什么,但根据您的代码 sn-p,这应该可以做到。

Class1(webapp.RequestHandler):

    @staticmethod
    def perform():
        random_id = str(uuid.uuid1())
        time_now = int(time.time()))
        info = {
            id: random_id,
            now: time_now
        }

       json_info = json.dumps(info)
       print json_info
       return json_info

    def get(self):
       self.response.write(self.perform())

Class2(webapp.RequestHandler):
    def get(self):
        getting_info = Class1.perform()
        getting_info_time = getting_info['now']
        print getting_info_time

另一条路线是让 Class2 继承 Class1,另一条路线是将“执行”功能移到文件级别之外。没有更多上下文,很难给出更合适的答案。

编辑: 那时创建两个类都继承的“BaseHandler”似乎更合适。检查缓存 ID 是否存在,如果没有,则创建并添加。

RANDOM_ID = "RANDOM_ID"

MyBaseHandler(webapp.RequestHandler):

    @staticmethod
    def get_random_id():
        cached = memcache.get(key=RANDOM_ID)
        if not cached:
            cached = {id: str(uuid.uuid1()), now: int(time.time()))}
            memcache.add(key=RANDOM_ID, value=cached, time=600)
        return cached

Class1(MyBaseHandler):

    def get(self):
       self.response.write(self.get_random_id())

Class2(MyBaseHandler):
    def get(self):
        print self.get_random_id()['now']

【讨论】:

  • 谢谢,这个答案对返回 JSON 最有帮助(有一些小的修改),尽管实际值发生了变化,这不是预期的结果。两个类都应该有完全相同的响应,因此我编辑了我的问题以反映该要求。我仍然赞成,因为它确实完成了它应该做的大部分工作。
  • 我对 memcache 的复杂性/时序不是最熟悉的,但我认为首先编辑代码以检查 memcache 键的存在应该可以解决问题。此外,从单个“BaseHandler”继承的两个类现在感觉更合适。
【解决方案2】:

如果两个处理程序都需要访问相同的数据,请将数据生成委托给一个函数。

def generate_data():
    random_id = str(uuid.uuid1())
    time_now = int(time.time()))
    info = {
        id: random_id,
        now: time_now
    }
    return info


Class1(webapp.RequestHandler):

    def get(self):
       info = generate_data()
       json_info = json.dumps(info)
       print json_info
       self.response.write(info)


Class2(webapp.RequestHandler):

    def get(self):
        info = generate_data()
        getting_info_time = info['now']
        print getting_info_time

如果为每个请求新生成数据,则此方法将有效。如果您需要为每个请求返回相同的数据,那么您需要将其存储在例如数据存储区、内存缓存或会话中,以便可以检索它。

【讨论】:

  • 您如何推荐使用 memcache 作为 UUID?我一直在尝试 memcache.addmemcache.get 没有运气:now_set = memcache.add(key=now, value=now, time=300) now_get = memcache.get(key=now) info = { id: random_id, now: now_get }
  • 这些值不断变化,而不是保持固定 300 秒。我查看了文档:cloud.google.com/appengine/docs/standard/python/refdocs/… 以及如何使用 memcache:cloud.google.com/appengine/docs/standard/python/memcache/using。是否存在内存缓存限制,阻止它存储值并为time=300 返回相同的值,还是我使用错了?
  • Memcache 并不可靠,除非您为可靠选项付费。 appengine 中的 Memcache 真的只是一个缓存,不应该依赖。