4

我在尝试每小时为特定的 django 视图重置缓存时遇到了一些麻烦。

现在,我正在使用 cache_page 装饰器来使用 Memcached 缓存我的视图。但是缓存会在一段时间后过期,并且某些用户的请求未缓存。

@cache_page(3600)
def my_view(request):
...

如何编写自己的 django manage.py 命令以每小时从 cron 刷新此视图的缓存?

换句话说,我在此处的答案中提到的 refresh_cache.py 文件中放入了什么: Django 缓存 - 可以先发制人地完成吗?

谢谢!

4

2 回答 2

2

在您的应用程序中,您可以创建一个名为的文件夹management,其中包含另一个文件夹commands和一个空__init__.py文件。在内部commands创建另一个__init__.py和一个文件,您可以在其中编写自定义命令。让我们称之为refresh.py

# refresh.py

from django.core.management.base import BaseCommand, CommandError
from main.models import * # You may want to import your models in order to use  
                          # them in your cron job.

class Command(BaseCommand):
    help = 'Posts popular threads'

    def handle(self, *args, **options):
    # Code to refresh cache

现在您可以将此文件添加到您的 cron 作业中。您可以查看本教程,但基本上您使用 crontab -e 来编辑您的 cron 作业和 crontab -l 来查看哪些 cron 作业正在运行。

您可以在Django 文档中找到所有这些以及更多内容。

于 2012-10-22T19:35:31.067 回答
1

我想扩展罗伯茨的答案以填写# Code to refresh cache

Timezome+location 使缓存很难使用,在我的情况下,我只是禁用了它们,我也不确定在应用程序代码中使用测试方法,但它似乎工作得很好。

from django.core.management.base import BaseCommand, CommandError
from django.test.client import RequestFactory
from django.conf import settings

from ladder.models import Season
from ladder.views import season as season_view


class Command(BaseCommand):
    help = 'Refreshes cached pages'

    def handle(self, *args, **options):
        """
        Script that calls all season pages to refresh the cache on them if it has expired.

        Any time/date settings create postfixes on the caching key, for now the solution is to disable them.
        """

        if settings.USE_I18N:
            raise CommandError('USE_I18N in settings must be disabled.')

        if settings.USE_L10N:
            raise CommandError('USE_L10N in settings must be disabled.')

        if settings.USE_TZ:
            raise CommandError('USE_TZ in settings must be disabled.')

        self.factory = RequestFactory()
        seasons = Season.objects.all()
        for season in seasons:
            path = '/' + season.end_date.year.__str__() + '/round/' + season.season_round.__str__() + '/'
            # use the request factory to generate the correct url for the cache hash
            request = self.factory.get(path)

            season_view(request, season.end_date.year, season.season_round)
            self.stdout.write('Successfully refreshed: %s' % path)
于 2013-08-25T16:51:05.317 回答