基于当前登录用户的Django数据库路由 [英] Django Database routing based on current user logged in
问题描述
在视图
类中,您可以调用 self.request.user
并基于此执行操作。就我而言,我希望能够根据登录的当前用户来切换数据库。无论如何,是否需要在<$ c $中注入 self.request
调用c> db_for_read()和 db_for_write()
这样的方法?
In a view
class, you could call self.request.user
and perform actions based on that. In my case, I would like to be able to switch databases depending on the current user logged in. Is there anyway to inject a self.request
call into the db_for_read()
and db_for_write()
methods like in the following?
class DataBaseRouter(object):
def db_for_read(self, model, **hints):
user = self.request.user
if user.id == 1:
return "master"
return "default"
def db_for_write(self, model, **hints):
user = self.request.user
if user.id == 1:
return "master"
return "default"
推荐答案
您可以使用 RouterMiddlewear
检查是否登录了哪个用户,然后将所有查询
重定向到您选择的特定数据库,如果您正在使用基于视图的
执行,这将对您有所帮助的查询。
You can use a RouterMiddlewear
to check if what user is logged in and then redirect all the queries
to a particular database of your choice, this would be help full if you are using view based
execution of the queries.
class RouterMiddleware (object):
def process_view( self, request, view_func, args, kwargs ):
# Check the user logged in
user = self.request.user
# Call your functions to set the database by passing the user.id
def process_response( self, request, response ):
# Make the database to default here if you wish to use it no longer
return response
class DataBaseRouter(object):
def db_for_read(self, model, user_id=None, **hints):
if user.id == 1:
return "master"
return "default"
def db_for_write(self, model, user_id=None, **hints):
if user.id == 1:
return "master"
return "default"
我已为其修改的链接您的要求。
Here is the link that I have modified for your requirement.
确保将 RouterMiddleware
添加到 MIDDLEWARE_CLASSES
。
这篇关于基于当前登录用户的Django数据库路由的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!