使一个函数的输出可供其他函数使用

2024-04-20 11:06:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让一些用户信息可用于我的系统中的两个不同功能视图.py. 但是,我只想访问数据库一次,而不是两次。 有办法吗?你知道吗

以下是输出一些用户信息的函数(userlocs):

def get_user_info(profile_ins):
    fav_loc = list()
    lat = list()
    lon = list()
    for loc in UserLoc.objects.filter(profile=profile_ins):
        fav_loc.append(loc.name)
        lat.append(loc.location.geo_code_lat)
        lon.append(loc.location.geo_code_lon)
    userlocs = list(zip(fav_loc, lat, lon))
    return userlocs

这是用户查看其配置文件时的查看功能。这是我第一次调用get\u user\u info:

def profile(request):
    profile_instance = Profile.objects.get(user=request.user)
    userlocs = get_user_info(profile_instance)
    context = {'locations': userlocs}
    return render(request, 'profile.html', context)

现在,我希望userloc列表也可用于以下函数。此函数用于将用户输入与现有的userloc信息进行比较。我知道我可以再次调用get\u user\u info函数,但我认为这是多余的,因为我已经调用过一次了。你知道吗

def add_location_exe(request):
    if request.method == 'POST':
        ln = UserLocForm(request.POST or None)
        if ln.is_valid():
            name = ln.cleaned_data.get("name")
            ## is name in userloc list ##

谢谢你的帮助。你知道吗


Tags: 函数用户nameinfo信息getrequestdef
1条回答
网友
1楼 · 发布于 2024-04-20 11:06:54

您所说的两个视图函数应该访问同一个全局变量。这不是一个好主意,原因不止一个:

  1. userloc的内容取决于数据库的状态。由于每个请求只调用一个视图,因此数据可能已更改。

  2. 您不能保证这两个请求甚至由同一个Python进程处理。因此,没有全局变量可以跨请求设置和持久化。

出于这两个原因,真正的全局变量(那些不变的变量;不是数据库记录!)应该保留在设置中。如果要在一个请求-响应周期内限制复杂应用程序中的数据库访问,可以使用^{}装饰器:

class Foo(object):
    def __init__(self, profile_ins):
        self.profile_ins = profile_ins

    @cached_property
    def get_user_info(self):
        return ...

# views.py
# ...
    foo = Foo()

这将为整个循环缓存foo.get_user_info的值。你知道吗

相关问题 更多 >