【问题标题】:Django - Is it possible to access some content of one function from another function?Django - 是否可以从另一个函数访问一个函数的某些内容?
【发布时间】:2021-04-06 05:19:00
【问题描述】:

我的一个基于 Django 的项目中有两个函数,位于 views.py 文件下。第一个函数生成一个视图页面,第二个函数只是根据 jQuery 请求返回一些响应。它们的外观如下:

第一个呈现显示页面的函数:

@login_required()
def watchlist_details(request, iid):
    ... ... ...
    ... ... ...
    contracts = dict(enumerate(x.rstrip() for x in symbols))
    automate = Automate()
    automate.init_symbol(contracts)
    automate.live_stream()
    ... ... ...
    ... ... ...
    return render(request, 'watchlist_show.html')

将在 jQuery 调用上返回一些响应的第二个函数:

def streaming_response(request):
    automate = Automate() #  need to replace this with: automate = automate_of_first_function
    result = automate.get_stream_result()
    json_result = json.dumps(result)
    return json_result

这里的问题在于第二个函数,我重新初始化了automate,它没有任何内容来生成响应。所以,我需要访问在watchlist_details函数中初始化的方法automate实例。

由于我在 Django 应用程序中遵循基于函数的视图而不是基于类的视图,因此无法创建全局/公共变量。而且我认为 Django 不允许在基于类的视图中创建多个方法(这对我来说也是一个令人困惑的概念)。

所以我的问题是,是否可以从第二个函数访问 automate 实例(在第一个函数中初始化)?如果是,那么我该如何访问它?

谢谢

【问题讨论】:

  • 你需要从根本上明白,每个HTTP请求都是独立的、无状态的。这与函数或类无关,而是第二个请求与之前的任何请求无关,服务器不记得任何内容。始终考虑多个用户可能同时使用您的服务器,和/或您可能同时运行两台或多台服务器,并且哪个服务器服务于请求是随机的。您只有请求本身包含的信息,并且需要从中获取所有必要的信息。

标签: python django


【解决方案1】:

将共享逻辑提取到新方法

def init_automate():
    contracts = dict(enumerate(x.rstrip() for x in symbols))
    automate = Automate()
    automate.init_symbol(contracts)
    automate.live_stream()
    return automate

def watchlist_details(request, iid):
    ...
    automate = init_automate()
    ...

def streaming_response(request):
    ...
    automate = init_automate()
    ...

也许使用缓存或实例级全局变量来保持初始化的automate 对象。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2010-10-10
    • 1970-01-01
    • 2022-10-24
    • 2011-11-04
    相关资源
    最近更新 更多