DJANGO:使用@user_passes_test登录后动态转发到"next"



我是 django 登录设置的新手。我已经研究了我的方式,得到了一些看起来不错的东西,并复制了它。

我发现了这个装饰器:@user_passes_test

这有助于我确保对我的"/dashboard"页面具有正确访问权限的人已登录。被重定向到登录后,网址是:

placeholder.it/login/?next=/dashboard/%3Fcvr%3D24256790

但是用户总是被发送到:

placeholder.it/accounts/loggedin

而不是下一个网址。怎么来了??

这是我的一些代码:views.py

@user_passes_test(lambda u:u.is_staff, login_url='/accounts/login/')
def dashboard(request):
    cvr = request.GET.get('cvr', '')
    return render(request,'dashboard.html', { "cvr": cvr})    

def login(request):
    c = {}
    c.update(csrf(request))
    return render_to_response('login.html', c)    

def auth_view(request):
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    user = auth.authenticate(username=username, password=password)    
    if user is not None:
        auth.login(request, user)
        return HttpResponseRedirect('/accounts/loggedin')
    else:
        return HttpResponseRedirect('/accounts/invalid')

登录.html

{% extends "base.html" %}    
{% block content %}    
  {% if form.errors %}
    <p class="error">Sorry, that's not a valid username or password</p>
  {% endif %}    
  <form action="{% url 'auth' %}" method="post">{% csrf_token %}
    <label for="username">User name:</label>
    <input type="text" name="username" value="" id="username">
    <label for="password">Password:</label>
    <input type="password" name="password" value="" id="password">    
    <input type="submit" value="login" />
  </form>    
  <br>
  Login to access all sites    
{% endblock %}

urls.py

url(r'^accounts/login/$', views.login, name='login'),
url(r'^accounts/auth/$', views.auth_view, name='auth'),
url(r'^dashboard/$', views.dashboard, name='dashboard'),

感谢任何帮助 <3

您的修饰器正在将未登录的用户发送到login视图。登录页面具有一个发布到auth_view视图的窗体。身份验证视图显式将每个登录用户重定向到 /accounts/loggedin

您正在通过 auth_view 中的代码自行重定向用户。代码不遵循next查询参数(修饰器附加到登录 URL 的参数)。代码应读取 next 参数的值,并将其放在窗体内的隐藏字段中。在 POST 请求auth_view 上,您应该读取该值并将用户重定向到该 URL。

如果用户

是否已登录,则有一个内置的装饰器来处理导入以下内容

from django.contrib.auth.decorators import login_required

并将装饰器放在函数上方:

@login_required(redirect_field_name='next') 
def page(request):

将其添加到您的登录模板

input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"

最新更新