跳转到主要内容

添加全局数据库只读设置。

项目描述

django-db-readonly

关于

全局禁用数据库写入的一种方式。它通过在Django的CursorWrapper和数据库连接的cursor wrapper之间插入一个光标包装器来实现。

安装

使用以下命令安装

> pip install django-db-readonly

然后,将readonly添加到您的INSTALLED_APPS中。

INSTALLED_APPS = (
    # ...
    'readonly',
    # ...
)

使用

您需要将此行添加到您的settings.py以使数据库为只读

# Set to False to allow writes
SITE_READ_ONLY = True

当您这样做时,对数据库的任何写操作都将生成异常。您应该捕获此异常并对其进行处理。或者让Django显示一个错误500页面。您想要捕获的异常是readonly.exceptions.DatabaseWriteDenied,它继承自django.db.utils.DatabaseError

还有一个处理异常并尝试按以下方式处理的中间件类。要启用中间件,将以下行添加到您的settings.py

MIDDLEWARE = (
    # ...
    'readonly.middleware.DatabaseReadOnlyMiddleware',
    # ...
)

这将捕获DatabaseWriteDenied异常。如果请求是POST请求,我们将用户重定向到相同的URL,但作为GET请求。如果请求不是POST(即GET),我们将仅显示一个带有文本的HttpResponse,告知用户网站处于只读模式。

此外,中间件类可以使用django.contrib.messages模块添加错误类型消息。将以下内容添加到您的settings.py

# Enable
DB_READ_ONLY_MIDDLEWARE_MESSAGE = True

然后,在生成DatabaseWriteDenied异常的POST请求中,我们将添加一个错误消息,告知用户网站处于只读模式。

对于额外的消息,有一个上下文处理器将SITE_READ_ONLY添加到上下文中。在您的settings.py中添加以下行

TEMPLATE_CONTEXT_PROCESSORS = (
    # ...
    'readonly.context_processors.readonly',
    # ...
)

像使用模板中的任何布尔值一样使用它,例如:{% if SITE_READ_ONLY %}我们正在维护.{% endif %}

配置

  • SITE_READ_ONLY - 用于禁用对数据库的写入。
  • DB_READ_ONLY_DATABASES - 强制只读的数据库名称列表(其他数据库将被忽略)。
  • DB_READ_ONLY_MIDDLEWARE_MESSAGE - 当数据库处于只读模式时,可用于通知用户的自定义消息。

测试

当前的测试非常基础。

注意事项

这将与Django Debug Toolbar一起工作。实际上,我在编写这个应用程序时受到了DjDT的sql面板的启发。

然而,为了使DDT和django-db-readonly都能正常工作,您需要确保在您的INSTALLED_APPS中将readonly放在debug_toolbar之前。否则,您需要负责调试发生的问题。当然,我不确定您为什么会在生产环境中运行DDT,同时在开发环境中运行django-db-readonly,但无论如何,我不是你。

更普遍地,如果您有其他修改了django.db.backends.util.CursorWrapperdjango.db.backends.util.CursorDebugWrapper的应用程序,您需要确保在INSTALLED_APPS中将readonly放在这些应用程序之前。

细节

这是如何做到的?django-db-readonly位于Django自己的游标包装器django.db.backends.util.CursorWrapper和数据库特定游标django.db.backends.*.base.*CursorWrapper之间。它覆盖了两个特定方法:executeexecutemany。如果网站处于只读模式,则会检查SQL语句是否包含任何写操作(定义在readonly.ReadOnlyCursorWrapper.SQL_WRITE_BLACKLIST中)。如果检测到写操作,则会引发异常。

CircleCI PyPI version

版权

版权© 2020,Chris Streeter,根据MIT软件许可证。有关更多信息,请参阅LICENSE。

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

django-db-readonly-0.7.0.tar.gz (5.7 kB 查看散列)

上传时间: 源代码

构建分发

django_db_readonly-0.7.0-py3-none-any.whl (7.6 kB 查看散列)

上传时间: Python 3

支持