码农家园

关闭
导航

关于python:Django:HttpResponseRedirect不起作用


authenticationdjangologinpythonredirect

Django: HttpResponseRedirect not working

我是Python / Django和整体编程的新手。我需要有关HttpResponseRedirect的帮助,因为它无法从我的登录视图工作。它确实可以从我的主Views文件工作,但不能按我想要的方式工作。

我没有重定向到所需的页面('/'),而是仅在同一页面上看到此内容:

Content-Type: text/html; charset=utf-8 Location: /

用户实际上已登录,但停留在同一页面上。因此,如果我手动转到所需的页面,将会看到我已登录。

这是相关的代码段。我到处都有自己的看法。我希望通过这种方式进行练习和更好地理解。

Urls.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin
from backend import settings
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^login/', 'backend.views.login', name = 'login'),
    url(r'^logout/', 'backend.views.logout', name = 'logout'),
    url(r'^$', 'backend.views.dash', name = 'dash'),
    url(r'^admin/', include(admin.site.urls)),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += staticfiles_urlpatterns()

Views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from dashboard.dashviews import left, right, topright
from authentication.authviews import LoginView, LogoutView
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def dash(request):
    return render(request, 'dash_template.html',
        {'left': left.dash_left(request),
         'right': right.dash_right(),
        'topright': topright.top_right(request)})

def login(request):
    if not request.user.is_authenticated():
        return render(request, 'login.html', {'login': LoginView.login_view(request)})
    else:
        return HttpResponseRedirect('/')

def logout(request):
    return render(request, 'logout.html', {'logout': LogoutView.logout_view(request)}) and HttpResponseRedirect('/login/')

LoginView.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.contrib import auth
from django.http import HttpResponseRedirect

def login_view(request):
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    user = auth.authenticate(username=username, password=password)
    if user is not None and user.is_active:
        # Correct password, and the user is marked"active"
        auth.login(request, user)
        # Redirect to dashboard
        return HttpResponseRedirect('/')
    else:
    # Show a message    
        return 'Please enter your username and password below.'

login.html-简单表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<center>

<p>
{{ login }}
</p>

  {% if form.errors %}
    <p class="error">Sorry, that's not a valid username or password
</p>
  {% endif %}


  <form action="./" method="post">
        <table border="0">
    <tr>
    <td>
    <label for="username">Username:</label>
    </td>
    <td>
    <input type="text" name="username" value="" id="username">
    </td>
    </tr>
    <tr>
    <td>
    <label for="password">Password:</label>
    </td>
    <td>
    <input type="password" name="password" value="" id="password">
    </td>
    </tr>
    </table>
    <input type="submit" value="login" />
    <input type="hidden" name="next" value="/" />
    {% csrf_token %}
  </form>

</center>

我按照Django的书籍教程进行操作,根据它,一切都应该正常工作。如您所见,我还尝试过在表单中??使用"下一个"隐藏字段,但该字段也不起作用。任何帮助,将不胜感激。我想知道我在这里想念的是什么。谢谢!

相关讨论

  • 由于您的urls.py上有名称,您是否尝试过使用反向实用程序功能?试试这个:HttpResponseRedirect(reverse(破折号))
  • 我不确定这是否可以解决所有问题,但是您的表单操作指向错误的位置。 (action ="将发布到当前网址)
  • 嗨!我刚刚尝试导入"从django.core.urlresolvers导入反向"并使用您指定的"反向"。不幸的是,结果是完全一样的。
  • 嘿@Shane,请告诉我它应该实际指向何处?我应该放在那儿?
  • 就像我说的那样,一个不错的HTML技巧是使用action=""(空字符串)将表单POST数据发送到当前URL,在这种情况下,这就是您想要的。或者,您可以使用action="{% url login %}"。
  • @Shane感谢您的回复!如果我将该字符串留空或使用相同的URL,结果仍然相同。但是,如果我放置另一个URL(不存在或存在),它确实会重定向!因此,对于我的仪表板,Ill只创建一个/ dash / URL而不是/即可,它应该可以工作!
  • 不幸的是,它没有工作...结果仍然是相同的。


在HTML中看到" Content-Type:文本/ html; charset = utf-8位置:/"的原因是,您将HttpResponse对象作为上下文数据的一部分返回,以呈现在响应中,而不是 实际反应。 您登出后看起来也有些怪异。 但是要使用您当前拥有的东西:

更改您的views.py

1
2
3
4
5
if not request.user.is_authenticated():
    # LoginView.login_view will return a HttpResponse object
    return LoginView.login_view(request)
else:
    ...

然后在LoginView.login中更改视图以始终返回所需的Response对象(重定向或所需呈现的页面)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def login_view(request):
    # if the request method is POST the process the POST values otherwise just render the page
    if request.method == 'POST':
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = auth.authenticate(username=username, password=password)
        if user is not None and user.is_active:
            # Correct password, and the user is marked"active"
            auth.login(request, user)
            # Redirect to dashboard
           return HttpResponseRedirect('/')
        else:
            # Show a message    
            err_msg = 'Please enter your username and password below.'
    return render(request, 'login.html', {'login': err_msg})
相关讨论

  • 非常感谢! 做到了! 当我遵循django的书时,我不完全了解您所做的更改,而那本书当时还没有。 生病必须进一步挖掘,看看发生了什么。
  • 嗨,尤里,蟾蜍。 我也有类似的问题。stackoverflow.com/questions/31085439/就我而言,我可以在同一页面中呈现目标模板(因为我没有在浏览器URL中看到目标模板地址)。请检查一下吗?


Copyright ©  码农家园 联系:[email protected]