首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >可以从Django管理页面禁用缓存吗?

可以从Django管理页面禁用缓存吗?
EN

Stack Overflow用户
提问于 2019-03-15 06:40:23
回答 5查看 3.8K关注 0票数 3

附加信息

我问过一种禁用缓存站点的方法。--这可能过分了,因为当数据库或生成页面的程序被修改时,我所需要的只是一种能够查看页面最新版本的方法。

有一个强烈的共识,即在运行时修改设置是一个非常糟糕的主意,

因此,一些想法:清除缓存可以工作,发送标志来指定我不想看到缓存的版本,或者指定来自IP地址的请求不应该看到缓存的页面

原始问题

我在ozake.com有一个基于Django的网站,我经常重写部分编程或更改页面内容。

每次我使用它时,我都会修改settings.py以禁用缓存,这样我就可以实时看到我的修改。

当我完成时,我重新启用缓存。

我正在使用基于文件的缓存。以下是settings.py的相关部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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?的复选框?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-03-28 04:28:22

如果您只想随心所欲地使整个缓存失效,您可能会创建一个琐碎的视图来执行以下操作:

文件views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.urls import path
from . import views

urlpatterns = [
    ...
    path('clear_cache/', views.clear_cache),
]

然后用浏览器调用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://HOST/clear_cache
票数 2
EN

Stack Overflow用户

发布于 2019-03-31 04:48:12

我最后做的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

缓存将被清除(如果我登录到管理页面)。

两个注释:

  1. 此地址将被缓存,因此必须每次更改标志字符串,以清除缓存。
  2. 标志被添加到页面标题中,这样您就可以确定您看到的是最新版本。
票数 1
EN

Stack Overflow用户

发布于 2019-03-23 03:03:23

使用单独的站点进行开发总是一件非常好的事情。不过,在生产站点上轻松禁用缓存可能会带来一些额外的好处:

  • 研究与缓存相关的细微错误
  • 用实际生产数据测量有效性能增益

我确实相信,只要少量的代码提供了一个瘦的自定义缓存后端,就可以成功地解决这个问题。

基本上:

  • Django在启动时实例化缓存“默认”对象一次,将其视为单例对象,并将其永久使用。
  • 在我们的自定义缓存后端中,我们将保留两个独立对象的内部实例(一个“虚拟”和一个“基于文件的”缓存),并且只通过所需的整数方法公开其中的一个。
  • 这样,我们实际上是充当FileBasedCache或DummyCache的类代理。
  • 我们可以轻松地使用变量来控制哪个对象是活动的,从而在运行时切换行为,而不需要重新启动Django。

以下POC已在一个小测试项目中进行了检查,取得了积极的结果。

首先,编写行为为FileBasedCache或DummyCache的“代理”类:

文件'project/mycache.py':

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

并在项目设置中引用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CACHES = {
    'default': {
        'BACKEND': 'project.mycache.MyCache',
        'LOCATION': '/var/www/mysite.com/cache,
    }
}

请注意,根据config.CACHING_ENABLED.的当前值,实际操作被委托给两个内部对象之一。代理模型中没有重新实现缓存逻辑。

最后,为了控制来自admin的切换标志(简单部分),为django-constance定义一个布尔值'CACHING_ENABLED‘(一个流行的应用程序,它提供一个Admin界面来编辑动态设置)。

将其添加到项目的设置中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = [
    ...
    'constance',
    'constance.backends.database',
]

CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'
CONSTANCE_CONFIG = {
    'CACHING_ENABLED': (True, 'Set to False to disable caching'),
}

然后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install django-constance[database]
python manage.py migrate
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55185061

复制
相关文章

相似问题

AndEngine Box2D Body GetContactList

14

如何旋转Box2d body?

10

Box2D:如何手动渲染body

32

Libgdx | Box2D | body冲突轮询

19

设置Box2d Body LIBGDX原点

115
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文