添加全局数据库只读设置。
项目描述
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.CursorWrapper
或django.db.backends.util.CursorDebugWrapper
的应用程序,您需要确保在INSTALLED_APPS
中将readonly
放在这些应用程序之前。
细节
这是如何做到的?django-db-readonly位于Django自己的游标包装器django.db.backends.util.CursorWrapper
和数据库特定游标django.db.backends.*.base.*CursorWrapper
之间。它覆盖了两个特定方法:execute
和executemany
。如果网站处于只读模式,则会检查SQL语句是否包含任何写操作(定义在readonly.ReadOnlyCursorWrapper.SQL_WRITE_BLACKLIST
中)。如果检测到写操作,则会引发异常。
版权
版权© 2020,Chris Streeter,根据MIT软件许可证。有关更多信息,请参阅LICENSE。
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
django-db-readonly-0.7.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | e164313ec65af1ceb15007035d9e8a27564c4b993352a7394dc63c36ef6dd77a |
|
MD5 | e9e54521e7b7090d55a6a0352d6da6e8 |
|
BLAKE2b-256 | d926741fe928d327170a20c20a2398b438ec7c7ac173913fe762399ebd4a66b2 |
django_db_readonly-0.7.0-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 3e7f335baea5072f3e0e8fdb3df6805daab7158781f7f0cc14b7eff96571ca25 |
|
MD5 | 46a12f4033fd1625939138b5caf8864f |
|
BLAKE2b-256 | 068b8c770e62bfcada7eed76b29ae6582e040ba26174b8b21e6a21634953a528 |