Django 可以将所需的登录应用于整个应用程序吗?

Django 可以将所需的登录应用于整个应用程序吗?,django,Django,有没有一种方法可以将login\u requireddecorator应用于整个应用程序?当我说“app”时,我指的是django意义上的应用程序,也就是说一组URL和视图,而不是整个项目。我认为您正在寻找包含所需登录名的应用程序。是的,您应该使用中间件 尝试查看存在一些差异的解决方案: -例外情况清单 -例外情况清单 -与登录所需URL列表相反 -最简单 这是一个老问题。但这里有: 这是URLConf中包含的的替代。p将login\u required应用于整个应用程序是否有效。我想知道是

有没有一种方法可以将
login\u required
decorator应用于整个应用程序?当我说“app”时,我指的是django意义上的应用程序,也就是说一组URL和视图,而不是整个项目。

我认为您正在寻找包含所需登录名的应用程序。

是的,您应该使用中间件

尝试查看存在一些差异的解决方案:

  • -例外情况清单
  • -例外情况清单
  • -与登录所需URL列表相反
  • -最简单

  • 这是一个老问题。但这里有:


    这是URLConf中包含的的替代。p将
    login\u required
    应用于整个应用程序是否有效。

    我想知道是否有任何解决方案可以使其像这样工作:

    /app/app.py
    class AppConfig(AppConfig):
        login_required = True
    
    /project/urls.py
    urlpatterns = [
        url(r'app/', include('app.urls', namespace='app'))
    ]
    
    /common/middleare.py
    def LogMiddleware(get_response):
        def middleware(request):
            # solution 1
            app = get_app(request)
            if app.login_required is True and request.is_authenticated is Fasle:
                return HttpResponseRedirect(redirect_url)
            # solution 2
            url_space = get_url_space(request.get_raw_uri())
            if url_space.namespace in ['app', 'admin', 'staff', 'manage'] and \
                    request.is_authenticated is False:
                return HttpResponseRedirect(redirect_url)
    

    我将检查是否有任何方法可以获取请求的应用程序或url名称。我认为它看起来更漂亮。

    从Django 3+开始,您可以通过应用中间件将login_require()设置为整个应用程序。你喜欢以下几点:

    步骤1:在yourapp目录中创建一个新文件anywhere.py,并编写以下内容:

    步骤2:将这个anythis.py添加到project/settings.py中的中间件[],如下所示

    步骤3:还将以下代码段添加到project/settings.py中


    +1-我本打算问同样的问题。###从Django 3+开始##
    import re
    from django.conf import settings
    from django.contrib.auth.decorators import login_required
    
    //for registering a class as middleware you at least __init__() and __call__()
    //for this case we additionally need process_view() which will be automatically called by Django before rendering a view/template
    
    class ClassName(object):
        
        //need for one time initialization, here response is a function which will be called to get response from view/template
        def __init__(self, response):
            self.get_response = response
            self.required = tuple(re.compile(url) for url in settings.AUTH_URLS)
            self.exceptions = tuple(re.compile(url)for url in settings.NO_AUTH_URLS)
    
        def __call__(self, request):
            //any code written here will be called before requesting response
            response = self.get_response(request)
            //any code written here will be called after response
            return response
    
        //this is called before requesting response
        def process_view(self, request, view_func, view_args, view_kwargs):
            //if authenticated return no exception
            if request.user.is_authenticated:
                return None
            //return login_required()
            for url in self.required:
                if url.match(request.path):
                    return login_required(view_func)(request, *view_args, **view_kwargs)
            //default case, no exception
            return None
    
    MIDDLEWARE = [
        // your previous middleware
        'yourapp.anything.ClassName',
    ]
    
    AUTH_URLS = (
        //disallowing app url, use the url/path that you added on mysite/urls.py (not myapp/urls.py) to include as your app urls
        r'/your_app_url(.*)$',
    )