如何在Django中为用户设置不同的urls.py文件库

问题描述

我的基础项目中有两个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。所以我不得不写一些额外的代码

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...