【问题标题】:Changing a setting variable from settings.py从 settings.py 更改设置变量
【发布时间】:2012-01-04 14:30:45
【问题描述】:

我正在使用带有 mod_wsgi 的 Django 1.3

在我的settings.py

DISABLE_SYSTEM = False
DISABLE_USER_INTERFACE = False
MIDDLEWARE_CLASSES = [
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]
if DISABLE_SYSTEM:
    MIDDLEWARE_CLASSES.insert(0, 'SomeMiddleware')
if DISABLE_USER_INTERFACE:
    MIDDLEWARE_CLASSES.append('SomeOtherMiddleware')

当我将DISABLE_SYSTEM 设置为True 时,SomeMiddlewareprocess_request 函数会返回带有HttpResponse 的警告消息,并且后面的中间件根本不会运行。这给了我一种系统关闭以进行维护

DISABLE_USER_INTERFACE过滤request,用户调用的任何视图函数都被屏蔽,而admin的url和管理函数正常运行。

到目前为止,我用它来维护不同的类型,我只是从文件中更改它并 touch wsgi 以重新加载 python 模块。但是现在,我需要使用一种预定的例程来停止基于用户的请求,并在后台进行一些维护和一些来自管理员的维护。

此时,i系统(而非用户)需要将DISABLE_USER_INTERFACEsettings.py设置为True并开始维护。但是我找不到更好的方法来做这件事,或者不是从settings.py 而是从其他地方找到更好的方法来处理这个问题。

settings py 中的行比更改DISABLE_USER_INTERFACE 是因为我需要每天使用一次此功能,并且为每个请求使用这两个中间件对我来说似乎不合逻辑。所以在我目前的模型中,它们只在需要运行时才运行

任何建议将不胜感激。

更新: 我想做的是在每天 19:00 - 19:30 期间禁用用户界面。我不确定是否要进行中间件级别检查,例如:

if 19:00<now()<19:30:
    stop system

对于每个请求。我需要一些更有效的东西来避免不必要的过程。或者中间件是那种工作的正确选择?

【问题讨论】:

    标签: python django django-settings


    【解决方案1】:

    当您计划更改设置后,您可能需要重新考虑您正在做什么。

    您的中间件可以更加智能。这可以让您的设置变得更加笨拙。

    我强烈建议您安装一个始终安装的SomeMiddleware 类。

    然后SomeMiddleware 类可以检查settings 并决定它应该执行哪种行为。

    还有更好的方法来做到这一点。

    您不一定需要修改定期维护的设置。在运行的 Django 应用程序中,您有很多与中间件通信的方式。最快的方法之一是通过数据库。

    您可以有一个“操作模式”类定义,其中包含一个(或几个)属性,这些属性由中间件简单地获取以查看发生了什么。您可以编写您的管理应用程序在此表上执行简单的更新以更改模式。

    您可以使用“操作模式”文件名(如果存在)更改中间件的行为。您只需要执行os.path.exists() 类型的函数来检查(快速)该做什么。

    【讨论】:

    • 我想要的是在 19.00 到 19.30 之间关闭系统,我考虑编写一个中间件来检查每个请求的时间并在维护时间阻止它们,但运行 if 19.00&lt;now()&lt;19.30: stop system 控制每个请求似乎都是不必要的。我正在寻找更有效的东西......
    • “但运行 if 19.00
    • 谢谢,因为我使用的是memcached 模块,所以我设置了一个 cron 来创建缓存键,我的 MiddleWare 会检查该键是否存在。由于memcache 支持每个memcache 对象的lifetime,因此不需要第二个cron 来删除相关的缓存键。
    • "我的 MiddleWare 检查是否存在该密钥。"检查时间可能要便宜得多。但是,既然您对此感到满意,那就干杯。
    • 谢谢,我会做一些压力测试来检查两者之间的差异(:
    猜你喜欢
    • 2016-07-05
    • 2014-03-08
    • 2012-12-14
    • 2022-12-05
    • 1970-01-01
    • 2012-02-09
    • 2011-08-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多