跳转到主要内容

禁用Django数据库写入。

项目描述

https://img.shields.io/github/actions/workflow/status/adamchainz/django-read-only/main.yml.svg?branch=main&style=for-the-badge https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge https://img.shields.io/pypi/v/django-read-only.svg?style=for-the-badge https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge pre-commit

禁用Django数据库写入。


更智能、更快速地工作,使用我的书籍Boost Your Django DX,涵盖了django-read-only、IPython和其他许多工具。


需求

支持Python 3.8到3.12。

支持Django 3.2到5.1。

安装

使用

pip

安装

python -m pip install django-read-only

然后将它添加到您的已安装应用中

INSTALLED_APPS = [
    ...,
    "django_read_only",
    ...,
]

用法

在您的设置文件中,将DJANGO_READ_ONLY设置为True,所有数据修改查询将引发异常

$ DJANGO_READ_ONLY=1 python manage.py shell
...
>>> User.objects.create_user(username="hacker", password="hunter2")
...
DjangoReadOnlyError(...)

为了方便起见,您也可以使用DJANGO_READ_ONLY环境变量来控制此操作,如果设置为非空字符串,则视为True。设置优先于环境变量。

在DJANGO_READ_ONLY设置为开启的会话中,您可以通过调用enable_writes()来重新启用写入

>>> import django_read_only
>>> django_read_only.enable_writes()

可以使用 disable_writes() 禁用写入。

>>> django_read_only.disable_writes()

要临时允许写入,请使用 temp_writes() 上下文管理器/装饰器。

>>> with django_read_only.temp_writes():
...     User.objects.create_user(...)
...

请注意,启用/禁用写入是全局状态,会影响所有线程和异步协程。

IPython扩展

django-read-only还可以作为IPython扩展快速启用/禁用只读模式。通过以下方式加载:

In [1]: %load_ext django_read_only

您可以通过设置到您的IPython配置文件来让扩展始终加载。

c.InteractiveShellApp.extensions.append("django_read_only")

加载后,使用 %read_only 行魔法来禁用或启用只读模式

In [2]: %read_only off
Write queries enabled.

In [3]: %read_only on
Write queries disabled.

这减少了禁用只读模式所需的输入量。

工作原理

防止写入最准确的方法是以只有读取权限的单独数据库用户连接。然而,这有一些限制 - Django不支持实时修改 DATABASES 设置,因此会话将无法暂时允许写入。

相反,django-read-only使用始终安装的数据库仪表板来检查执行的查询,并仅允许看起来像读取的查询。它采用“关闭失败”的哲学,因此任何未知的内容都会失败,这在理论上应该是合理的。

由于django-read-only使用Django数据库仪表板,因此它不能阻止通过底层数据库连接(通过 django.db.connection.connection 访问)运行的查询,并且它不能过滤存储过程(使用 connection.callproc())内的操作。虽然在实践中这些操作非常罕见,但django-read-only的方法对大多数项目来说都很有用。

项目详情


下载文件

下载适用于您平台的项目文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

django_read_only-1.16.0.tar.gz (7.6 kB 查看哈希值)

上传于 源代码

构建版本

django_read_only-1.16.0-py3-none-any.whl (6.5 kB 查看哈希值)

上传于 Python 3

由以下支持