首页 文章

Django在用户登录后挂起用户重定向用户

提问于
浏览
1

我通过我的 login.html 页面上的表单使用django 's '登录视图:

<form class="form-horizontal" method="post" action="{% url 'django.contrib.auth.views.login' %}">
    {% csrf_token %}
  <div class="control-group">
    <div class="controls">
      {{ form.username }}
    </div>
    <div class="controls controlsbtm">
      {{ form.password }}
    </div>
  </div>
  <div class="control-group-bottom">
    <div class="controls-btm">
        <input type="submit" value="Sign In" class="loginBtn" />
        <input type="hidden" name="next" value="{{ next }}" />

    </div>
  </div>        
</form>

如果用户是特定组的一部分,我有一个自定义装饰器来检查某些页面,如果他们不是,我将它们重定向回登录页面 . 使用:

@login_required

@user_passes_test(is_admin)

问题是,djangos内置了返回登录页面并成功登录的功能,使您返回到上一个URL . 因此,如果您登录并且您不在该组中,您将陷入循环 .

我想这样:

以B组中的用户身份登录

尝试需要A组用户的URL

  • 返回登录页面

以B组中的用户身份登录

  • 返回标准主页,不重定向回上一个网址

要么

以A组用户身份登录

  • 重定向回以前的网址

我该怎么做呢?

**按照雅各布的想法编辑后,我已经达到了可以将REDIRECT_URL指向自定义视图的程度 . 但在这种观点中,我需要能够说:

原始URL希望用户做什么?

这是否与新登录的详细信息匹配,如果是,请转到该URL,如果没有,请转到home.html

我仍然不确定如何做到这一点

2 回答

  • 1

    你可以使用Settings.LOGIN_REDIRECT_URL .

    通过这种方式,您可以重定向到其他视图,您可以在其中进行组检查并从那里再次重定向到正确的位置 .

    编辑:设置LOGIN_REDIRECT_URL仅在删除下一个参数时有效 . 来自文档:

    当contrib.auth.login视图没有下一个参数时,登录后重定向请求的URL .

    Here是一个描述如何操作的问题 .

    覆盖contrib.auth.login可能是另一种方法 . 让Django做默认的登录工作,然后查看你的小组 . 然后重定向到正确的位置(通过下一个参数) .

    EDIT2:

    如果我找对了你想要一些如下设置:总是在失败时返回登录页面 .

    • 以组A中的用户身份登录:is_admin => True(在组中)=>在成功时重定向到上一页

    • 以组B中的用户身份登录:is_admin => False(不在组中)=>重定向到默认(登录保护)页面

    试试这个:

    urls.py

    urlpatterns = patterns('',
        url(r'^admin/', include(admin.site.urls), name='nasenb'),
        url(r'^login/', login, {'template_name': 'admin/login.html'}),
        url(r'^adminonly/', admin_only),
        url(r'^protected/', protected_content),
        url(r'^', free_content, name='index'),
    )
    

    views.py

    def is_admin(user):
        return True #or False for test purpose
    
    # login_url='/protected/': this is the default redirect url 
    # where to go if is_admin fails but the login succeeded
    @login_required()
    @user_passes_test(is_admin, login_url='/protected/', redirect_field_name=None)
    def admin_only(request):
        return HttpResponse('Access granted, passed "is_admin"')
    
    @login_required()
    def protected_content(request):
        return HttpResponse('this content does''n require admin privs')
    """
    this is some previous page
    """
    def free_content(request):
        return HttpResponse('Some data! Free for everyone!')
    

    希望这可以帮助!

  • 1

    这对我有用:

    from django.http import HttpResponseRedirect
    def loggedin_view(request):
        usergroup = None
        if request.user.is_authenticated():
            usergroup = request.user.groups.values_list('name', flat=True).first()
        if usergroup == "staffGroup":
            return HttpResponseRedirect("/cmit/userDash")
        elif usergroup == "supervisorGroup":
            return HttpResponseRedirect("/cmit/supervisorDash")
        elif usergroup == "auditGroup":
            return HttpResponseRedirect("/cmit/auditDash")
        elif usergroup == "mgtGroup":
            return HttpResponseRedirect("/cmit/mgtDash")
        else:
            return HttpResponseRedirect("/admin/")
    

相关问题