• django 强制登录最佳实践


    参考:

    https://python-programming.courses/recipes/django-require-authentication-pages/

    即通过中间件来做AOP拦截。不用每个函数每个类加修饰器/MixIn。

    1. 在某个处理用户相关的模块中添加middleware.py, 内容如下:

    from django.http import HttpResponseRedirect
    from django.conf import settings
    from re import compile
    
    EXEMPT_URLS = [compile(settings.LOGIN_URL.lstrip('/'))]
    if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
        EXEMPT_URLS += [compile(expr) for expr in settings.LOGIN_EXEMPT_URLS]
    
    class LoginRequiredMiddleware:
        """
        Middleware that requires a user to be authenticated to view any page other
        than LOGIN_URL. Exemptions to this requirement can optionally be specified
        in settings via a list of regular expressions in LOGIN_EXEMPT_URLS (which
        you can copy from your urls.py).
    
        Requires authentication middleware and template context processors to be
        loaded. You'll get an error if they aren't.
        """
        def process_request(self, request):
            assert hasattr(request, 'user'), "The Login Required middleware
     requires authentication middleware to be installed. Edit your
     MIDDLEWARE_CLASSES setting to insert
     'django.contrib.auth.middlware.AuthenticationMiddleware'. If that doesn't
     work, ensure your TEMPLATE_CONTEXT_PROCESSORS setting includes
     'django.core.context_processors.auth'."
            if not request.user.is_authenticated():
                path = request.path_info.lstrip('/')
                if not any(m.match(path) for m in EXEMPT_URLS):
                    return HttpResponseRedirect(settings.LOGIN_URL)

    2. 使用此middleware

    settings.py 中的 middleware_classes的最后添加一行

    MIDDLEWARE_CLASSES = [
        ...   
        'myapplication.middleware.LoginRequiredMiddleware',
    ]

    3. 如果有要放水的url,通过settings.py中添加LOGIN_EXEMPT_URLS(tuple of string)变量设置,例如:

    LOGIN_EXEMPT_URLS = (
        r'^accounts/signup/$',
    )
  • 相关阅读:
    UIGestureRecognizer在多层视图中的触发问题
    mysql出现Waiting for table metadata lock的原因及解决方案
    SQL逆向工程
    自己总结的ruby on rails 查询方法
    hdu 1536 SG函数模板题
    spring 源码分析之BeanPostProcessor
    spring bean生命周期管理--转
    java.lang.Long cannot be cast to java.lang.Integer解决办法
    Mybatis之Oracle增删查改示例--转
    Anti-If: The missing patterns--转
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/6163571.html
Copyright © 2020-2023  润新知