我正在尝试使用Django的缓存系统创建登录视图。到目前为止,这是我的代码:
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
username_exists = User.objects.filter(username=cd['username1'])
if username_exists.count() != 0:
username = username_exists[0]
if username.password == cd['password']:
currentuser = cd['username1']
request.session['loggedin'+currentuser] = True
return HttpResponseRedirect('/user/%' % currentuser)
else:
form = LoginForm(request.POST)
return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
else:
form = LoginForm(request.POST)
return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
else:
form = LoginForm(request.POST)
return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
else:
form = LoginForm()
return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
我在数据库中使用的模型如下:
class User(models.Model):
username = models.CharField(max_length=15)
password = models.CharField(max_length=25)
这是表单“LoginForm”:
class LoginForm(forms.Form):
username1 = forms.CharField(max_length=15, label="Username")
password = forms.CharField(max_length=25, widget=forms.PasswordInput, label="Password")
以下是我正在使用的模板的一部分:
<h3>Login</h3>
<form action="" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Submit" style="margin-left:170px;margin-top:50px;">
</form>
视图只是刷新登录页面而不是重定向到用户页面,表格信息仍然填写(request.POST)。
我是Django的新手,所以如果我做的事情非常愚蠢,请提醒我。
感谢您的帮助。
答案 0 :(得分:2)
问题是你的最终成功条款涉及直接检查密码vs user.password
这是一种单向哈希密码。因此,您可能会检查mypassword
vs sha1$b322a$7e51a244d45f70d17b0bbca2b7369c1732b09c69
相反,使用django.contrib.auth.check_password
或authenticate
函数将为您进行密码比较,并将用户登录。您似乎正在进行某种手动登录,其中放置了会话标志将用户标记为已登录。您的所有用户也将是AnoymousUser
个对象:)
阅读身份验证框架...... django.contrib.auth
非常有用。
如果您使用内置函数,则可以使用更简单的快捷方式(如request.user.is_authenticated()
)来确定登录状态。
无论如何,在旁边讲道,手动检查密码:
https://docs.djangoproject.com/en/1.1/topics/auth/#manually-checking-a-user-s-password
要使用框架实际记录某人: https://docs.djangoproject.com/en/1.1/topics/auth/#django.contrib.auth.authenticate
你的代码的另一个问题是很难说出失败的原因 - 用户/你将无法获得有关他的登录失败的有用信息。
通常,最好将此信息放在表单清理方法中,以便您可以引发ValidationErrors
,它会自动显示在您的表单中,而不会使多个if块混乱。
答案 1 :(得分:1)
你正在重新发明轮子。来自contrib.auth的用户模型已经检查了重复的用户名。
如果您想提供自己的表单和视图来创建用户,几乎所有您需要的代码都已经存在于contrib.auth中。