Django用户身份验证和登录

2024-05-06 00:04:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Django身份验证创建一个简单的登录。所有的代码在这里工作,但我认为这是违反干的原则。我将解释:

在我的表单.py我有一个简单的登录表单:

class LoginForm(forms.Form):
  email = forms.CharField()
  password = forms.PasswordField()

  def clean(self):
    email = self.cleaned_data.get('email', None)
    password = self.cleaned_data.get('password', None)
    u = authenticate(email, password)
    if u is None:
      raise forms.ValidationError(ERROR_MSG)
      if not u.is_active:
        raise forms.ValidationError(ERROR_MSG)

所以我已经在这里检查用户了。然而,在我的视图.py

def login(request):
  login_form = LoginForm(request or None)
  if login_form.is_valid():
    #This part is repeated
    email = request.POST.get('email')
    password = request.POST.get('password')
    u = authenticate(email, password)
    login(request, u)

  return render(request, 'home.html', {})

我再次查询数据库,这对我来说似乎违反干。有人有更好的方法吗?我想将LoginForm重新用于其他用途,但也希望做到干净。你知道吗

有什么想法吗?你知道吗


Tags: pyselfnone表单getifisemail
1条回答
网友
1楼 · 发布于 2024-05-06 00:04:25

您可以在form对象上设置user,然后在视图中使用这个user,而不是执行authenticate()两次。你知道吗

表单.py

class LoginForm(forms.Form):
    email = forms.CharField()
    password = forms.PasswordField()

    def clean(self):
        email = self.cleaned_data.get('email', None)
        password = self.cleaned_data.get('password', None)
        self.u = authenticate(email, password) # set the user as an instance variable
        if self.u is None:
            raise forms.ValidationError(ERROR_MSG)
        if not self.u.is_active:
            raise forms.ValidationError(ERROR_MSG)

视图.py

def login(request):
    login_form = LoginForm(request or None)
    if login_form.is_valid():
        login(request, login_form.u) # directly pass the user by accessing from login_form object

    return render(request, 'home.html', {})

相关问题 更多 >