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

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.CursorWrapperdjango.db.backends.util.CursorDebugWrapper,您需要确保 把readonly放在 INSTALLED_APPS

细度

这是怎么做到的?好吧,django db readonly介于 django自己的游标包装器位于django.db.backends.util.CursorWrapper 数据库特定的光标位于 django.db.backends.*.base.*CursorWrapper。它覆盖了两个特定的 方法:executeexecutemany。如果站点是只读的 模式,然后检查sql是否包含任何写操作 (在readonly.ReadOnlyCursorWrapper.SQL_WRITE_BLACKLIST中定义)。如果 检测到写入,引发异常。

许可证

使用MIT许可证。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java RMI客户端访问被拒绝   java让JavaFX事件监听器与我的方法对话   java与xml spring配置相关   java当我在字符串中插入这个XML Soap请求时,为什么Eclipse会给我一个错误?   音频音频合成   java创建了一个Tic-Tac-Toe应用程序,我有一个bug,它每次在同一个正方形上声明一个平局   java为返回的字符串值设置参数   Java中的ClassFormatError   java在启动后更改Spring云配置服务器uri   用Java中的自定义类替换默认字符串类   java junit测试套件:ClassNotFoundException   java自定义对象集包含相同的对象   通过关系查找的java Spring数据CRUDepository   java将数据存储到aerospike中   java使用itextpdf将添加内容的pdf转换为安卓中的位图   java正在遍历队列的concurrentHashMap,以查看是否所有队列都是空的,而其他线程可能会添加到队列中   java Hibernate:未找到本机查询异常   java Mockito准确地验证所有参数   java我可以在它自己的类中声明一个对象吗?