图片验证码功能在Django中超级简单的实现
图片验证码功能在Django中
很多场景下Web应用需要利用图片验证码以防范暴力攻击,比如在用户登录页面。而Django以及配合django-simple-captcha模块可以非常轻松的实现图片验证码功能。
-
安装django-simple-captcha模块:
pip install django-simple-captcha
-
在项目的settings.py文件中做如下操作:(备注:假设你已经将开发所有其他部分的代码,比如model,模板,views等等)
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', "app01", #你之前已经创建好的app,普通的app "captcha" # ]
这样就将captcha注册为app。
在urls.py文件中添加captha的url(备注:你现有的url无需做任何修改)
# 其他的url path('/captcha',include("captcha.urls")) #假设已经导入include
-
在views.py中,你此前已经创建的form类增加captcha部分:
from django import forms from captcha.fields import CaptchaField class LoginForm(forms.Form): #此处应该有其他字段(之前已经创建的,比如username, password等 captcha=CaptchaField()
这样我们自己定义的LoginForm(它继承于forms.Form类)就有了captcha字段,此时就可以与其他字段一起传给前端模板
比如在views.py
def account_login(request):
if request.method == 'GET':
form = LoginForm()
print(form)
return render(request,'account_login.html',{'form':form})
form = LoginForm(data=request.POST)
if form.is_valid():
admin_object = models.Admin.objects.filter(username=form.cleaned_data.get('username'),password=form.cleaned_data.get('password') ).first()
if not admin_object:
form.add_error('password','输入用户名或者密码错误)
return render(request,'account_login.html',{'form':form})
else:
request.session['info'] = {'id':admin_object.id,'username':admin_object.username}
return redirect('/admin/list/')
return render(request,'account_login.html',{'form':form})
这里需要注意的是,由于我们自己创建的LoginForm,增加了captha字段,该字段并没有存储在数据库表中,因此models.Admin.objects.filter(** form.cleaned_data)不能用字典的方式传参,而是直接用上述方法直接取相应的字段去数据库中进行查询。
STRIVE FOR PROGRESS,NOT FOR PERFECTION