我正在尝试使用Django,我尝试创建一个登录/注册应用程序。这是我卡住的地方 - 我能够注册用户,但我无法使用它们登录。这是我认为相关的代码:
views.py
def login(request, template='accounts/sign_in.html'):
if request.user.is_authenticated():
return redirect(reverse('games'))
if request.method == 'POST':
post = request.POST.copy()
if 'password' in post:
post['password'] = make_password(post['password'])
form = AuthenticationForm(data=post)
if form.is_valid():
login(request, form.get_user())
messages.success(
request, "Successfully logged in.", extra_tags='success')
return redirect(reverse('games'))
else:
messages.warning(
request, "Wrong username or password." + request.POST['username'] + " " + request.POST['password'], extra_tags='error')
return redirect(reverse('login'))
return views.login(request, template)
def register(request, template='accounts/sign_up.html'):
if request.user.is_authenticated():
return redirect(reverse('home'))
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
new_user = User(
username=form.cleaned_data['username'],
password=make_password(form.cleaned_data['password1']),
is_active=True,
)
new_user.save()
messages.success(request, "Your account was successfully created.")
return redirect(reverse('games'))
else:
form = RegisterForm()
return render(request, template, {'register_form': form})
当我尝试使用我创建的用户(用户名:qwe,密码:qweqweqwe)登录时,我会再次登录,但会在消息中打印完全相同的用户名和密码:
Wrong username or password.qwe qweqweqwe
然而,当我尝试交互式shell时,这就是我得到的:
>>> User.objects.all()
[<User: admin>, <User: asd>, <User: qwe>]
>>> User.objects.all()[2]
<User: qwe>
>>> User.objects.all()[2].password
u'pbkdf2_sha256$10000$HM2k6uDntJ68$DLqHKcGxtJG7pJC7tbZcm29vB88LEgaw2xroqZEkTFw='
所以我有这样的用户,这是一个有效的帐户。
答案 0 :(得分:1)
我很确定你不需要在这个中呼叫make_password
:
if 'password' in post:
post['password'] = make_password(post['password'])
form = AuthenticationForm(data=post)
将普通request.POST
传递给data
,表单本身会进行加密并对数据库进行测试。这是AuthenticationForm
的{{1}}方法的片段,它执行此操作:
clean
您可以看到整个定义here。
我想您使用def clean(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if username and password:
self.user_cache = authenticate(username=username,
password=password)
...
中的官方make_password
函数,但仔细查看文档,通常,用户注册函数会自动执行此操作,因此您无需执行此操作。
反正:
在django.contrib,auth
致电后检查错误表单是否正在产生,并将您的is_valid
代码更改为:
login
希望这有帮助!
答案 1 :(得分:0)
login()
这可能是问题所在:
login(request, form.get_user())
您已经拥有login
功能,它恰好是一个视图。我想您要确认用户身份验证(form.is_valid()
不会自动执行此操作)。
更多详情请见the documentation of auth
module:
如何在
中记录用户如果您有经过身份验证的用户,则要附加到当前用户 会话 - 这是通过
login()
函数完成的。的登录()
要在视图中记录用户,请使用
login()
。它需要一个HttpRequest 对象和User对象。login()
将用户的ID保存在会话中, 使用Django的会话框架。请注意,匿名会话期间保留的任何数据都会保留在 用户登录后的会话。
此示例显示了如何同时使用
authenticate()
和login()
:from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: if user.is_active: login(request, user) # Redirect to a success page. else: # Return a 'disabled account' error message else: # Return an 'invalid login' error message.
正如Paulo所说,AuthenticationForm
已经处理了密码哈希。请阅读官方文档以获取示例:
Using the Django authentication system: Authentication in Web requests