如果我有一些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得到数据。这很荒谬。
或者也许有其他的方法来做这项工作?
2条答案
按热度按时间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
内部调用它,而不是在外部。iqxoj9l92#
避免多次加载数据和防止函数
fetched_data_from_postgres
运行两次的最佳解决方案是使用缓存框架和Django。查看文档了解更多细节:https://docs.djangoproject.com/en/stable/topics/cache/它的设置相对简单,而且它应该能完美地解决你的问题。如果你觉得它有点矫枉过正,那么问题是你真的需要速度吗?你确定你没有试图过早地优化吗?