首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DJANGO:使用@user_passes_test登录后动态转发到"next“

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

Stack Overflow用户
提问于 2016-06-03 11:45:49
回答 2查看 873关注 0票数 0

我是django登录设置的新手。我研究了我的方法,找到了一些似乎很好的东西,并复制了它。

我发现了一个装潢师:@user_passes_test

这有助于我确保访问我的"/dashboard“页面的人已经登录。重定向到登录后,url是:

代码语言:javascript
复制
placeholder.it/login/?next=/dashboard/%3Fcvr%3D24256790

但是用户总是被发送到:

代码语言:javascript
复制
placeholder.it/accounts/loggedin

下一个网址。怎么会??

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

代码语言:javascript
复制
@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')

login.html

代码语言:javascript
复制
{% 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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-03 11:56:11

您的装饰师将发送未登录到login视图的用户。登录页面有一个表单,该表单可以发布到auth_view视图。auth视图显式地将每个登录用户重定向到/accounts/loggedin

您正在通过auth_view中的代码自行重定向用户。您的代码不尊重next查询参数(装饰器在登录url后面)。您的代码应该读取next参数的值,并将其放在表单中的一个隐藏字段中。在POST请求到auth_view时,您应该读取该值并将用户重定向到该url。

票数 4
EN

Stack Overflow用户

发布于 2017-04-20 10:03:37

如果用户已登录或未导入以下内容,则需要处理内置的装饰器

代码语言:javascript
复制
from django.contrib.auth.decorators import login_required

并将装饰师置于您的功能之上:

代码语言:javascript
复制
@login_required(redirect_field_name='next') 
def page(request):

将此添加到登录模板中

代码语言:javascript
复制
input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37613554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档