django登录验证码的代码实现
时间: 2023-05-29 15:02:03 浏览: 84
可以使用 Django 内置的验证码工具 django-simple-captcha 。
安装
可以直接使用 pip 安装,命令如下:
```
pip install django-simple-captcha
```
配置
在你的 settings.py 中添加以下配置:
```
INSTALLED_APPS = [
# ...
'captcha',
# ...
]
CAPTCHA_LENGTH = 4 # 验证码的长度
CAPTCHA_FONT_SIZE = 24 # 验证码字体大小
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_dots',) # 噪点函数
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' # 验证码生成函数
```
使用
在你的表单页面中添加以下代码:
```
{% load captcha %}
<form method="post">
{% csrf_token %}
{% captcha %}
<button type="submit">提交</button>
</form>
```
检验验证码
在表单提交后,可以通过 request.session.get('captcha') 来获取验证码,然后与用户输入的验证码进行比较,从而实现验证码校验。
完整示例
views.py
```
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic import FormView
from .forms import LoginForm
class LoginView(FormView):
template_name = 'login.html'
form_class = LoginForm
success_url = reverse_lazy('home')
def form_valid(self, form):
# 获取表单数据
username = form.cleaned_data['username']
password = form.cleaned_data['password']
captcha = form.cleaned_data['captcha']
# 验证验证码
if captcha != self.request.session.get('captcha'):
messages.error(self.request, '验证码错误')
return redirect(reverse_lazy('login'))
# 验证用户名和密码
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(self.request, user)
messages.success(self.request, '登录成功')
return super().form_valid(form)
else:
messages.error(self.request, '该用户已被禁用')
else:
messages.error(self.request, '用户名或密码错误')
return redirect(reverse_lazy('login'))
```
forms.py
```
from django import forms
from captcha.fields import CaptchaField
class LoginForm(forms.Form):
username = forms.CharField(label='用户名', max_length=50)
password = forms.CharField(label='密码', widget=forms.PasswordInput())
captcha = CaptchaField(label='验证码')
```
login.html
```
{% extends 'base.html' %}
{% block content %}
<h1>登录</h1>
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary mt-3">登录</button>
</form>
{% endblock %}
```