Django:HttpResponseRedirect 不重定向到下一页
Django: HttpResponseRedirect doesn't redirect to next page
我正在尝试使用 django 的 auth
框架让用户登录,然后重定向到新页面。以下是与应用程序相关的文件(名为 portal
)。
forms.py
class StudentLoginForm(forms.Form):
username = forms.CharField(required = True, label = 'Webmail', max_length = 25)
password = forms.CharField(widget=forms.PasswordInput)
urls.py
urlpatterns = [
url(r'^stud_login/$', views.stud_login, name = 'stud_login'),
url(r'^stud_logout/$', views.stud_logout, name = 'stud_logout'),
url(r'^atry/$', views.atry, name = 'atry'),
]
views.py
def stud_login(request):
if request.method == "POST":
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username = username, password = password)
if user is not None:
auth.login(request, user)
# args = {}
# args['message'] = "Login Successful"
return HttpResponseRedirect('portal/atry')
else:
args = {}
args['login_failed'] = True
args['login_tried'] = True
args['error_message'] = "Wrong credentials"
args['login_form'] = StudentLoginForm()
return render(request, 'portal/login.html', args)
else:
args = {}
args.update(csrf(request))
args['login_form'] = StudentLoginForm()
args['login_tried'] = False
return render(request, 'portal/login.html', args)
@login_required
def atry(request):
# message = "Login Successful"
# args['message'] = message
return HttpResponseRedirect('/portal/atry/')
@login_required
def stud_logout(request):
auth.logout(request)
# args = {}
return HttpResponseRedirect('/portal/stud_login')
login.html
<p>Login Form</p>
{% if login_tried %}
{% if login_failed %}
<p>{{ error_message }}</p>
{% endif %}
{% endif %}
<form action="{% url 'stud_login' %}" method="post" accept-charset="utf-8">
{% csrf_token %}
{{ login_form.as_p}}
<input type="submit" value="Login">
</form>
我面临的问题是当我在 portal/stud_login
的登录表单中输入详细信息并单击 Login
时,视图将用户重定向到 /portal/stud_login/portal/atry
。而这个 url 与 urls.py
中的任何 urlpatterns
都不匹配。它应该重定向到 /portal/atry
.
谁能解释我做错了什么?
您缺少前导正斜杠。您可以通过以下方式解决问题:
return HttpResponseRedirect('/portal/atry')
在您当前的代码中,portal/atry
是相对的。它被添加到登录 url /portal/stud_login/
中,使 /portal/stud_login/portal/atry
.
更好的方法是使用 reverse
和 url 模式的名称,而不是在代码中硬编码 url。
from django.core.urlresolvers import reverse
return HttpResponseRedirect(reverse('atry'))
这可以使用 redirect
快捷方式进一步简化。
from django.shortcuts import redirect
return redirect('atry')
我正在尝试使用 django 的 auth
框架让用户登录,然后重定向到新页面。以下是与应用程序相关的文件(名为 portal
)。
forms.py
class StudentLoginForm(forms.Form):
username = forms.CharField(required = True, label = 'Webmail', max_length = 25)
password = forms.CharField(widget=forms.PasswordInput)
urls.py
urlpatterns = [
url(r'^stud_login/$', views.stud_login, name = 'stud_login'),
url(r'^stud_logout/$', views.stud_logout, name = 'stud_logout'),
url(r'^atry/$', views.atry, name = 'atry'),
]
views.py
def stud_login(request):
if request.method == "POST":
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username = username, password = password)
if user is not None:
auth.login(request, user)
# args = {}
# args['message'] = "Login Successful"
return HttpResponseRedirect('portal/atry')
else:
args = {}
args['login_failed'] = True
args['login_tried'] = True
args['error_message'] = "Wrong credentials"
args['login_form'] = StudentLoginForm()
return render(request, 'portal/login.html', args)
else:
args = {}
args.update(csrf(request))
args['login_form'] = StudentLoginForm()
args['login_tried'] = False
return render(request, 'portal/login.html', args)
@login_required
def atry(request):
# message = "Login Successful"
# args['message'] = message
return HttpResponseRedirect('/portal/atry/')
@login_required
def stud_logout(request):
auth.logout(request)
# args = {}
return HttpResponseRedirect('/portal/stud_login')
login.html
<p>Login Form</p>
{% if login_tried %}
{% if login_failed %}
<p>{{ error_message }}</p>
{% endif %}
{% endif %}
<form action="{% url 'stud_login' %}" method="post" accept-charset="utf-8">
{% csrf_token %}
{{ login_form.as_p}}
<input type="submit" value="Login">
</form>
我面临的问题是当我在 portal/stud_login
的登录表单中输入详细信息并单击 Login
时,视图将用户重定向到 /portal/stud_login/portal/atry
。而这个 url 与 urls.py
中的任何 urlpatterns
都不匹配。它应该重定向到 /portal/atry
.
谁能解释我做错了什么?
您缺少前导正斜杠。您可以通过以下方式解决问题:
return HttpResponseRedirect('/portal/atry')
在您当前的代码中,portal/atry
是相对的。它被添加到登录 url /portal/stud_login/
中,使 /portal/stud_login/portal/atry
.
更好的方法是使用 reverse
和 url 模式的名称,而不是在代码中硬编码 url。
from django.core.urlresolvers import reverse
return HttpResponseRedirect(reverse('atry'))
这可以使用 redirect
快捷方式进一步简化。
from django.shortcuts import redirect
return redirect('atry')