问题描述
我的基础项目中有两个urls文件: urls.py admin_urls.py
根据所请求的用户,将访问不同的URL。并根据请求区分用户。 我创建了一个中间件文件,其中包含:
class URLHandlerMiddleware(object):
def __init__(self,get_response):
self.get_response = get_response
def __call__(self,request):
response = self.get_response(request)
# if not request.user.is_anonymous:
if not request.user.user:
if request.Meta['saleschannel'] == SALES_CHANNEL_IDS['a510b9']:
request.URLconf = 'hyp_users_svc.admin_urls'
else:
request.URLconf = 'hyp_users_svc.urls'
return response
根据此参数销售渠道区分用户。
这是我在设置中的中间件列表
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware','django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','oauth2_provider.middleware.OAuth2TokenMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','hyp_users_svc.services.versioned.v1.middlewares.url_handler.URLHandlerMiddleware',## my url middleware
'hyp_users_svc.services.versioned.v1.middlewares.error_handler.ErrorResponseMiddleware'
]
但这不起作用。 中间件的订购可能存在问题,但我最初尝试调用中间件,但仍无法正常工作。
预先感谢
解决方法
您添加了身份验证后端吗?添加身份验证可能会解决问题
AUTHENTICATION_BACKENDS = (
'oauth2_provider.backends.OAuth2Backend',# Uncomment following if you want to access the admin
#'django.contrib.auth.backends.ModelBackend'
'...',)
工作吗?
,身份验证和授权是两个不同的概念。您正在寻找的是基于用户角色的授权。 一个自定义的登录装饰器应该考虑到这一点,并根据其角色重定向用户。
,因此,当前代码库的问题在于它正在使用 call 方法,该方法返回请求的响应。相反,我不得不更新我的process_request方法,该方法将仅处理请求之前的代码。
class URLHandlerMiddleware(MiddlewareMixin):
def process_request(self,request):
# for unprotected calls
if 'saleschannel' in request.headers:
if request.headers['saleschannel'] == 'a510b9':
set_urlconf('hyp_users_svc.admin_urls')
request.urlconf = 'hyp_users_svc.admin_urls'
else:
request.urlconf = 'hyp_users_svc.urls'
return None
使用MiddlewareMixin将自动调用我的 init 和 call 方法。我只需要决定要使用的url文件即可,该文件是在process_request方法中完成的。 这个方法的唯一问题是我无法使用此请求参数访问request.META。所以我不得不写一些额外的代码