首页 > 解决方案 > 如何在 Django 中间件中忽略媒体和静态 URL

问题描述

我正在尝试重定向无权查看该页面的用户。在我的数据库中,我保存了 url 名称。例子 -company_list

path('company/list', CompanyListView.as_view(), name='company_list'),

现在我正在使用 EXEMPT_URLS,其中保存了 url 名称,并且用户可以免除这些 url。

EXEMPT_URLS = [
    'login',
    'logout',
    'superadmin_dashboard',
    'admin_dashboard',
]

class PermissionRequiredMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):

        assert hasattr(request, 'user')

        current_url = resolve(request.path_info).url_name

        print(request.path_info)

        if request.user.is_authenticated and current_url not in EXEMPT_URLS :
           if request.user.userprofile.user_role_id == 1:
                return redirect('superadmin_dashboard')
            else:
                return redirect('admin_dashboard')

现在问题来了。就像我正在添加一家公司及其徽标。当我去的时候,company_list它显示的是列表,而不是图像。

"GET /media/user_profiles/logo_L7T5FKg.png HTTP/1.1" 302

我发现了这个问题,当我评论def process_view()它在我的模板中显示图像时。但是当我取消注释时,它不会显示图像。基本上我的中间件阻止了"GET /media/user_profiles/logo_L7T5FKg.png HTTP/1.1" 302.

我怎么能把图片的网址名称放进去EXEMPT_URLS

标签: djangodjango-modelsdjango-formsdjango-templatesdjango-views

解决方案


基本上,如果用户没有权限,我会重定向到仪表板。所以在我的中间件MEDIA and STATIC URL中得到了HTTP response status code 302 Found因为MEDIA AND STATIC URL我的自定义中间件也在运行。所以忽略我发现request.path

from django.conf import settings
    ...

    MEDIA_URL = request.path.startswith(settings.MEDIA_URL)
    STATIC_URL = request.path.startswith(settings.STATIC_URL)

    if request.user.is_authenticated and current_url not in EXEMPT_URLS and not MEDIA_URL and not STATIC_URL:
        if request.user.userprofile.user_role_id == 1:
            return redirect('superadmin_dashboard')
        else:
            return redirect('admin_dashboard')

推荐阅读