Pic*_*Man 0 python django function
#In my views.py file
def home(request):
myfunc()
return render(request, "home.html", {})
Run Code Online (Sandbox Code Playgroud)
home.html 需要一段时间才能加载,因为每次单击它时都会执行 myfunc 函数。有没有办法在访问 home.html 之前将 myfunc 加载到服务器上,以便加载速度更快。是否可以每 15 分钟调用一次 myfunc,而不是每次访问 home.html 时调用一次?
有没有办法在访问 home.html 之前将 myfunc 加载到服务器上,以便加载速度更快。是否可以每 15 分钟调用一次 myfunc,而不是每次访问 home.html 时调用一次?
我认为你可以通过三种方式解决这个问题:
1)缓存
通过缓存,您只需存储大量计算的结果,以便在第一次计算后保存它。这样做的好处是,它非常易于使用和设置,而且速度相当快,但是第一次访问它(以及每次它被无效时)时,它会很慢,并且您可以存储的大小受到限制在缓存中(对于 memcached,通常为 1MB)。
一旦你设置了缓存服务器,你通常可以使用Django 的装饰器:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
Run Code Online (Sandbox Code Playgroud)
就您而言,您似乎并未实际使用 的结果myfunc,因此您没有任何数据可实际缓存?因此,缓存不会有太大帮助。
2) 计划任务
对您来说更好的解决方案可能是创建一个调用的管理命令myfunc,然后在服务器的 crontab 中创建一个条目,每十五分钟运行一次。
假设您有一个名为 的 Django 管理命令update_myfunc。然后,您可以编辑服务器的 crontab 并添加如下行:
*/15 * * * * /location/of/python /var/www/yourproject/manage.py update_myfunc
Run Code Online (Sandbox Code Playgroud)
这将在您编辑了 crontab 的任何服务器上每十五分钟运行一次该命令。(要编辑 crontab,请输入命令crontab -e。
3) 芹菜
您还可以使用 Celery 异步运行此命令,甚至可以使用celerybeat它来代替上面的 cron 条目。
为此,您需要安装一个消息队列(Redis 非常容易安装),然后您需要在设置文件中对其进行配置。您还需要 Celery Python 库,然后需要让 Celery 作为工作线程或通过 celerybeat 在该服务器上运行(可能 celerybeat 就是您想要的)。
4)以上的组合
还有第四种选择,即将上述一些选项结合起来。举例来说,它myfunc会执行一系列存储在数据库中的计算,然后以某种方式组装计算出的数据以在视图中使用。
在这种情况下,您可以做的是将其功能分为两部分:计算部分和视图帮助部分。然后,您可以使用 celery 或 cron 每十五分钟运行一次计算部分,然后您可以缓存调用视图帮助部分的视图。
此外,如果您不将此计算存储在数据库中,您实际上可以手动将内容放入缓存中。在这种情况下,您可以在缓存中存储一些内容,然后在视图需要时使用专门创建的缓存键进行检索。