添加全局数据库只读设置。
ambition-django-db-readonl的Python项目详细描述
关于
一种全局禁用对数据库的写入的方法。这项工作由 在django的CursorWrapper和 数据库连接的游标包装器。
安装
该库位于 PyPi,所以你可以 抓住它:
pip install django-db-readonly
然后将readonly添加到INSTALLED_APPS。:
INSTALLED_APPS = ( # ... 'readonly', # ... )
用法
您需要将这一行添加到settings.py中,使数据库成为只读:
# Set to False to allow writes SITE_READ_ONLY = True
执行此操作时,对数据库的任何写入操作都将生成 例外。你应该抓住这个异常并以某种方式处理它。或者 让django显示一个error 500 page。 您要捕获的异常是 readonly.exceptions.DatabaseWriteDenied继承自 django.db.utils.DatabaseError。
还有一个中间件类将处理异常和 尝试按照下面的说明处理它们。要启用中间件,请将以下行添加到 settings.py:
MIDDLEWARE_CLASSES = ( # ... 'readonly.middleware.DatabaseReadOnlyMiddleware', # ... )
这将捕获DatabaseWriteDenied异常。如果请求是post请求,我们 将用户重定向到相同的url,但作为get请求。如果 请求不是post(即get),我们只显示 HttpResponse,文本告诉用户站点是只读的 模式。
此外,中间件类可以使用 django.contrib.messages模块。添加:
# Enable DB_READ_ONLY_MIDDLEWARE_MESSAGE = True
到您的settings.py,然后在生成 DatabaseWriteDenied异常,我们将添加一条错误消息 通知用户站点处于只读模式。
对于其他消息传递,有一个上下文处理器可以添加 SITE_READ_ONLY进入上下文。在您的 settings.py:
TEMPLATE_CONTEXT_PROCESSORS = ( # ... 'readonly.context_processors.readonly', # ... )
像模板中的任何布尔值一样使用它,例如。 {% if SITE_READ_ONLY %} We're down for maintenance. {% endif %}
测试
目前还没有包括任何测试。风险自负。
注意事项
这将与Django Debug Toolbar一起工作。事实上, 我的灵感来自DDT’s sql panel 在编写此应用程序时。
然而,为了让ddt和django db readonly都工作,您 需要确保在debug_toolbar输入之前有readonly。 你的INSTALLED_APPS。否则,您负责调试 发生了什么事。当然,我不知道你为什么要用滴滴涕 在开发中生产和运行django db readonly,但不管怎样, 我不是你。
更一般地说,如果你有任何其他的应用程序可以修改 django.db.backends.util.CursorWrapper或 django.db.backends.util.CursorDebugWrapper,您需要确保 把readonly放在 INSTALLED_APPS。
细度
这是怎么做到的?好吧,django db readonly介于 django自己的游标包装器位于django.db.backends.util.CursorWrapper 数据库特定的光标位于 django.db.backends.*.base.*CursorWrapper。它覆盖了两个特定的 方法:execute和executemany。如果站点是只读的 模式,然后检查sql是否包含任何写操作 (在readonly.ReadOnlyCursorWrapper.SQL_WRITE_BLACKLIST中定义)。如果 检测到写入,引发异常。
许可证
使用MIT许可证。