django默认和自定义的用户身份验证
· 阅读需 3 分钟
前言
在做项目时,身份验证是目前疑虑最多的地方:为什么这里要新建一个 User 模型?为什么要重写管理器?这篇文章通过查阅文档,尝试从最佳实践的角度给出答案。
默认验证方式
模型 视图函数 表单
注册 登录 登出
默认 User 模型
默认 User 模型主要包含以下字段:username、password、email、first_name、last_name。也就是说,如果有别的字段的需求(比如用户头像),就要自定义用户模型。目前暂不涉及权限,等到后续项目中接触到了,再添加。
视图函数
注册
没有内置的注册视图,有内置的注册表单 UserCreationForm。UserCreationForm 的要求字段为用户名、邮箱和两次密码输入。
# views.py
class SignUpView(FormView):
template_name = 'core/signup.html'
form_class = forms.SignUpForm
success_url = '/login/'
def form_valid(self, form):
form.save()
return super().form_valid(form)
# forms.py
class SignUpForm(UserCreationForm):
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
username = forms.CharField(widget=forms.TextInput(attrs={
'placeholder': 'Your username',
'class': 'w-full py-4 px-6 rounded-xl'
}))
email = forms.CharField(widget=forms.EmailInput(attrs={
'placeholder': 'Your email address',
'class': 'w-full py-4 px-6 rounded-xl'
}))
password1 = forms.CharField(widget=forms.PasswordInput(attrs={
'placeholder': 'Your password',
'class': 'w-full py-4 px-6 rounded-xl'
}))
password2 = forms.CharField(widget=forms.PasswordInput(attrs={
'placeholder': 'Repeat password',
'class': 'w-full py-4 px-6 rounded-xl'
}))
登录
有内置视图 LoginView,有内置的表单 AuthenticationForm
# forms.py
class LogInForm(AuthenticationForm):
username = forms.CharField(widget=forms.TextInput(attrs={
'placeholder': 'Your username',
'class': 'w-full py-4 px-6 rounded-xl'
}))
password = forms.CharField(widget=forms.PasswordInput(attrs={
'placeholder': 'Your password',
'class': 'w-full py-4 px-6 rounded-xl'
}))
# urls.py
path('login/', auth_views.LoginView.as_view(template_name='core/login.html', authentication_form=LogInForm), name='login'),
# settings.py
LOGIN_REDIRECT_URL = '/'
登出
有内置视图 LogoutView,无需视图
# urls.py
path('logout/', auth_views.LogoutView.as_view(), name='logout')
# settings.py
LOGOUT_REDIRECT_URL = '/'