如何在Django视图之外加载数据?

z9smfwbn  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(134)

如果我有一些Django视图,比如'first','second'等等,我想在这些视图之外加载一些数据,但在视图内部使用。
下面举一个例子来理解我的想法。

#function execution time is long, that is why i want to laod it only once when run programm.

fetched_data_from_postgres = some function which load data from postgres and return list with postgres data

def first(request):
    #and the i want to use that previous value in all my views
    fetched_data_from_postgres = do something
    return HttpResponse("first VIEW")

def second(request):
    #and the i want to use that previous value in all my views
    fetched_data_from_postgres = do something
    return HttpResponse("secondVIEW")

def third(request):
    #and the i want to use that previous value in all my views
    fetched_data_from_postgres = do something
    return HttpResponse("third VIEW")

当我运行我的django项目的时候,这个方法很好用,比如python manage.py runserver,但是当我运行gunicorn或者wsgi的时候,当我可以指定worker计数的时候,当worker改变的时候,这个变量就丢失了,需要刷新页面才能让之前的worker得到数据。这很荒谬。
或者也许有其他的方法来做这项工作?

g9icjywg

g9icjywg1#

当你用python manage.py runserver在本地启动项目时,这种方法不起作用,它只起作用一次,当项目启动时,然后你每次都需要重新加载项目。这是因为any_views.py中的所有东西都只在项目启动时加载一次,除了你的函数。所以你必须重新启动你的项目,以便刷新你的fetched_data_from_postgres变量。
更好的方法是创建一个脚本fetch_script.py,将函数some function which load data from postgres and return list with postgres data移动到其中,并在views.py内部调用它,而不是在外部。

iqxoj9l9

iqxoj9l92#

避免多次加载数据和防止函数fetched_data_from_postgres运行两次的最佳解决方案是使用缓存框架和Django。查看文档了解更多细节:https://docs.djangoproject.com/en/stable/topics/cache/
它的设置相对简单,而且它应该能完美地解决你的问题。如果你觉得它有点矫枉过正,那么问题是你真的需要速度吗?你确定你没有试图过早地优化吗?

相关问题