代码之家  ›  专栏  ›  技术社区  ›  Maxim Volkomorov

django重写身份验证登录方法

  •  2
  • Maxim Volkomorov  · 技术社区  · 8 年前

    我要覆盖 login 中的函数 __init__.py 属于 django.contrib.auth

    我执行了以下步骤:

    URL。py公司

    url(r'^login/$', 'my_login'),
    

    意见。py公司

    from django.contrib import auth
    
    def login(request, user, backend=None):
       # do some stuff
    

       INSTALLED_APPS = [
       #'django.contrib.auth',
        'my_auth_app'
       ]
    

    但我觉得这是错误的做法。

    实际上我想得到默认值 contrib.auth 带overidden 登录名 方法

    1 回复  |  直到 8 年前
        1
  •  6
  •   Maxim Volkomorov    8 年前

    完成此方法。

    URL。py公司

    # separate my custom login from django default auth
    path('accounts/login/', CustomLoginView.as_view(), name='login'), 
    path('accounts/', include('django.contrib.auth.urls')),
    

    意见。py公司

    def custom_login(request, user, backend=None):
        """
        modificated generic.auth login.
        Send signal with extra parameter: previous [session_key]
        """
    
        # get previous seesion_key for signal 
        prev_session_key = request.session.session_key
    
        """ 
            original code
    
        """
        # send extra argument prev_session_key 
        user_logged_in.send(sender=user.__class__, request=request, user=user, prev_session_key=prev_session_key)
    
    # custom class-based view overriden on LoginView
    class CustomLoginView(LoginView):
    
        def form_valid(self, form):
            """Security check complete. Log the user in."""
    
            # changed default login
            custom_login(self.request, form.get_user())
    
            return HttpResponseRedirect(self.get_success_url())
    

    当我基于default login()进行custom\u登录时,恐怕这不是最好的方法,因为我正在复制原始代码的一部分。也许这里最好用一个装饰师?