我通过我的 login.html
页面上的表单使用 django 的“登录 View ”:
<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组用户身份登录
- 重定向回之前的网址
我该怎么做?
**编辑 在遵循 Jakob 的想法之后,我已经可以将 REDIRECT_URL 指向自定义 View 。 但从这个角度来看,我需要能够说:
原始 URL 希望用户是什么?
是否与新登录的详细信息匹配,如果是,请转到该网址 如果没有,请转到 home.html
我仍然不确定如何做到这一点
最佳答案
您可以使用Settings.LOGIN_REDIRECT_URL 。
这样,您可以重定向到其他 View ,您可以在其中进行组检查并从那里再次重定向到正确的位置。
编辑: 仅当删除下一个参数时,设置 LOGIN_REDIRECT_URL 才会起作用。来自文档:
The URL where requests are redirected after login when the contrib.auth.login view gets no next parameter.
Here是一个描述如何做的问题。
覆盖 contrib.auth.login 可能是另一种方法。让 Django 执行默认的登录操作,然后检查您的组。然后重定向到正确的位置(通过下一个参数)。
编辑2:
如果我没猜错的话,你需要像下面这样的设置: 失败时始终返回登录页面。
- 以 A 组用户身份登录:is_admin => True(在组中)=> 成功时重定向到上一页
- 以 B 组用户身份登录:is_admin => False(不在组中)=> 重定向到默认(受登录保护)页面
试试这个:
url.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'),
)
View .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!')
希望这有帮助!
关于Django 在登录待定组后重定向用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23676637/