为什么Django身份验证始终不返回

时间:2019-03-29 09:25:26

标签: django django-forms

我有几个问题

  1. 为什么Authenticate()总是不返回任何内容,但是当我尝试使用Exists()时会返回用户吗?
  2. 我们可以仅使用Exists()进行用户登录吗?

我使用django 1.11.7和基于类的视图

这是我的views.py

class ShopLoginView(FormView):
    template_name = 'shop/login.html'
    form_class = LoginForm
    success_url = '/shop/'

这是我的表格。py

class LoginForm(forms.Form):

    email = forms.EmailField()
    password = forms.CharField()

    def clean(self):
        cleaned_data = super(LoginForm, self).clean()
        email  = cleaned_data.get("email")
        password  = cleaned_data.get("password")
        user = authenticate(username=email, password=password)

        if user is not None:
            print(user)
        else:
            print(user)
            raise forms.ValidationError("Wrong Email or Password")

这是我使用Exists()方法的时候

class LoginForm(forms.Form):

    email = forms.EmailField()
    password = forms.CharField()

    def clean(self):
        cleaned_data = super(LoginForm, self).clean()
        email  = cleaned_data.get("email")
        password  = cleaned_data.get("password")
        user = User.objects.filter(email=email, password=password)

        if user.exists():
            print(user)
        else:
            print(user)
            raise forms.ValidationError("Wrong Email or Password")

关于可能发生的事情的任何想法?

2 个答案:

答案 0 :(得分:0)

您已经以某种方式将密码存储为纯文本。您应该不能能够使用filterexists通过用户名和密码来查找用户;纯文本密码不匹配。

authenticate将始终对所传递的密码进行哈希处理,并将其与数据库中现有的哈希版本进行比较。由于您保存的密码未进行哈希处理,因此不匹配。

您没有显示创建用户的方式,但是必须始终使用create_user或使用set_password设置密码。

答案 1 :(得分:-1)

您可以像这样检查身份验证,以对哈希密码进行身份验证,然后进行匹配:-

 user = authenticate(username=username, password=password)
 if user and user.is_active:   
          print(user)