用于限制Django代码库部分数据库访问的工具
项目描述
Django sans DB
限制Django代码部分数据库访问的工具。
安装
pip install django-sans-db
如果您想使用 {% sansdb %}
模板标签,您需要将 "sans_db"
添加到您的 INSTALLED_APPS
。
用法
上下文管理器
您可以使用 block_db
来阻止代码段对数据库的访问。
from sans_db.context_managers import block_db
User.objects.create(...) # Works outside of block_db()
with block_db():
User.objects.get() # Raises DatabaseAccessBlocked
如果您在Django的 DATABASES
设置中有多条记录,则 block_db
将默认阻止所有记录。
如果您想阻止对数据库子集的访问,请传递它们的别名列表(即 DATABASES
字典中的键)。
from sans_db.context_managers import block_db
with block_db(databases=["replica"]):
User.objects.using("primary").create(...) # This DB isn't blocked.
User.objects.using("replica").get() # Raises DatabaseAccessBlocked
装饰器
您可以使用 block_db
装饰函数和方法,以阻止其中的数据库访问。例如
from sans_db.context_managers import block_db
class MyClass:
def allowed(self):
User.objects.create(...) # Works outside of block_db()
@block_db()
def not_allowed(self):
User.objects.create(...) # Raises DatabaseAccessBlocked
模板后端
您可以使用我们的自定义模板后端在渲染Django模板时阻止对数据库的访问。
注意:目前,仅支持Django模板。
您可以通过将模板后端设置为 "sans_db.template_backends.django_sans_db.DjangoTemplatesSansDB"
来阻止所有模板的数据库访问。
例如
# settings.py
TEMPLATES = [
{
"BACKEND": "sans_db.template_backends.django_sans_db.DjangoTemplatesSansDB",
"APP_DIRS": True,
"OPTIONS": {...},
},
]
尝试查询数据库将引发 sans_db.exceptions.DatabaseAccessBlocked
。
请参阅Django文档中关于模板引擎支持的部分,了解如何将其设置为辅助模板渲染器的详细设置。
模板标签
您可以使用{% sansdb %}
模板标签来在模板的一部分中阻止数据库访问。
该模板标签接受数据库别名作为字符串或变量。如果作为变量传递,则接受字符串或字符串的可迭代对象。如果没有传递别名,则将阻止所有数据库。
注意:尝试访问数据库时将引发DatabaseAccessBlocked
异常。
阻止所有数据库
{% load sansdb %}
{% sansdb %}
{# ... #}
{% endsansdb %}
阻止模板中命名的数据库列表
{% load sansdb %}
{% sansdb "second_db" "third_db" %}
{# ... #}
{% endsansdb %}
从上下文变量阻止数据库列表
{% load sansdb %}
{% sansdb databases %}
{# ... #}
{% endsansdb %}