4

特定の django ビューに対して 1 時間ごとにキャッシュをリセットしようとすると、問題が発生しました。

現在、memcached を使用してビューをキャッシュするために cache_page デコレーターを使用しています。ただし、キャッシュはしばらくすると期限切れになり、一部のユーザーからの要求はキャッシュされなくなります。

@cache_page(3600)
def my_view(リクエスト):
...

独自の django manage.py コマンドを作成して、このビューのキャッシュを 1 時間ごとに cron から更新するにはどうすればよいですか?

つまり、ここの回答に記載されている refresh_cache.py ファイルに何を入れますか: Django caching - can it be done pre-emptively?

ありがとう!

4

2 に答える 2

2

アプリで、別のフォルダーと空のファイルmanagementを含む というフォルダーを作成できます。内部で、カスタム コマンドを記述する別のファイルを作成します。それを呼びましょう:commands__init__.pycommands__init__.pyrefresh.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 に答える