附加信息
我问过一种禁用缓存站点的方法。--这可能过分了,因为当数据库或生成页面的程序被修改时,我所需要的只是一种能够查看页面最新版本的方法。
有一个强烈的共识,即在运行时修改设置是一个非常糟糕的主意,。
因此,一些想法:清除缓存可以工作,发送标志来指定我不想看到缓存的版本,或者指定来自IP地址的请求不应该看到缓存的页面。
原始问题
我在ozake.com有一个基于Django的网站,我经常重写部分编程或更改页面内容。
每次我使用它时,我都会修改settings.py以禁用缓存,这样我就可以实时看到我的修改。
当我完成时,我重新启用缓存。
我正在使用基于文件的缓存。以下是settings.py的相关部分:
CACHES = {
'default': {'BACKEND':
#'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/www/mysite.com/cache',
当我在网站上工作时,我会注释掉最后两行,并取消对虚拟缓存行的注释。
这意味着SSH‘’ing进入站点,修改settings.py,在站点上工作,然后重新修改它.
,我有没有办法把它变成/admin中admin.py?的复选框?
发布于 2019-03-28 04:28:22
如果您只想随心所欲地使整个缓存失效,您可能会创建一个琐碎的视图来执行以下操作:
文件views.py
from django.core.cache import cache
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
from django.views.decorators.cache import never_cache
@never_cache
def clear_cache(request):
if not request.user.is_superuser:
raise PermissionDenied
cache.clear()
return HttpResponse('Cache has been cleared')
文件urls.py
from django.urls import path
from . import views
urlpatterns = [
...
path('clear_cache/', views.clear_cache),
]
然后用浏览器调用它:
http://HOST/clear_cache
发布于 2019-03-31 04:48:12
我最后做的是:
from django.core.cache import cache
def PageView(request):
...
if request.GET.get('clear') == 'cache':
if request.user.is_superuser:
title = request.GET.get('flag') + ' ' + title
cache.clear()
...
return render(request, template, context)
所以现在我可以去https://ozake.com/en/home?clear=cache&flag=sdf了
缓存将被清除(如果我登录到管理页面)。
两个注释:
发布于 2019-03-23 03:03:23
使用单独的站点进行开发总是一件非常好的事情。不过,在生产站点上轻松禁用缓存可能会带来一些额外的好处:
我确实相信,只要少量的代码提供了一个瘦的自定义缓存后端,就可以成功地解决这个问题。
基本上:
以下POC已在一个小测试项目中进行了检查,取得了积极的结果。
首先,编写行为为FileBasedCache或DummyCache的“代理”类:
文件'project/mycache.py':
from django.core.cache.backends.filebased import FileBasedCache
from django.core.cache.backends.dummy import DummyCache
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from constance import config
class MyCache(DummyCache):
def __init__(self, *args, **kwargs):
self.dummy_cache = DummyCache(*args, **kwargs)
self.file_cache = FileBasedCache(*args, **kwargs)
def _active_cache(self):
"""
Select either DummyCache or FileBasedCache based on configuration
"""
return self.file_cache if config.CACHING_ENABLED else self.dummy_cache
def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
return self._active_cache().add(key, value, timeout, version)
def get(self, key, default=None, version=None):
return self._active_cache().get(key, default, version)
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
self._active_cache().set(key, value, timeout, version)
def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None):
return self._active_cache().touch(key, timeout, version)
def delete(self, key, version=None):
self._active_cache().delete(key, version)
def has_key(self, key, version=None):
return self._active_cache().has_key(key, version)
def clear(self):
self._active_cache().clear()
并在项目设置中引用如下:
CACHES = {
'default': {
'BACKEND': 'project.mycache.MyCache',
'LOCATION': '/var/www/mysite.com/cache,
}
}
请注意,根据config.CACHING_ENABLED.的当前值,实际操作被委托给两个内部对象之一。代理模型中没有重新实现缓存逻辑。
最后,为了控制来自admin的切换标志(简单部分),为django-constance定义一个布尔值'CACHING_ENABLED‘(一个流行的应用程序,它提供一个Admin界面来编辑动态设置)。
将其添加到项目的设置中:
INSTALLED_APPS = [
...
'constance',
'constance.backends.database',
]
CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'
CONSTANCE_CONFIG = {
'CACHING_ENABLED': (True, 'Set to False to disable caching'),
}
然后:
pip install django-constance[database]
python manage.py migrate
https://stackoverflow.com/questions/55185061
复制相似问题