在Django模型中是否有类似开关/标志的东西,可以启用/禁用任何更改。
通过启用此开关,您不能更改/删除任何模型对象,即使是在引用的模型中(用外键连接),甚至不能从Django-shell中更改/删除。
发布于 2020-01-06 14:59:40
您可以使用多个数据库连接,这些连接实际上只是两个不同用户连接到同一个数据库的连接。一个具有完全权限,另一个仅具有读取权限
settings.py
DATABASES = {
'default': {
'NAME': 'foo',
'ENGINE': 'django.db.backends.mysql',
'USER': 'superuser',
'PASSWORD': 'superuser',
},
'restricted': {
'NAME': 'foo',
'ENGINE': 'django.db.backends.mysql',
'USER': 'restricted',
'PASSWORD': 'restricted',
}
}然后添加一个自定义database router,它在两个
class SwitchRouter:
def _writes_disabled(self):
return False # or True if the "switch" has been triggered somehow
def db_for_write(self, model, **hints):
if self._writes_disabled():
return 'restricted'settings.py
DATABASE_ROUTERS = ['path.to.SwitchRouter']发布于 2020-01-06 14:27:06
既然你要求停止插入甚至是Django shell,我可以想到一种方法。一定有更优雅的方法。请注意,我自己没有尝试过,但我的建议是基于目前here的信息。因此,等待Stackoverflow中更有经验的成员可能是个好主意。
我假设您使用的是MySQL。请更改下面的建议以适合您的数据库管理系统。
要实现这一点,您需要具有GRANT特权的数据库管理员权限。另外,假设您在SETTINGS.py中的Django用户名是'abcdef‘(在数据库部分),您想要限制的表是'mytable’,数据库是'mydatabase‘。我还假设您希望从任何IP访问都会发生这种情况。
基本上你将不得不撤销插入/删除权限,如下所示。
REVOKE INSERT, DELETE ON mydatabase.mytable FROM 'abcdef'@'%';您可以对其他权限重复此过程。
要启用此功能,您需要授予相同的权限,如下所示。
GRANT INSERT, DELETE ON mydatabase.mytable TO 'abcdef'@'%';如果这是你想要的,请告诉我。
https://stackoverflow.com/questions/59607361
复制相似问题