图片验证码功能在Django中超级简单的实现实现

发布时间 2023-05-30 11:52:33作者: Jason_huawen

图片验证码功能在Django中

很多场景下Web应用需要利用图片验证码以防范暴力攻击,比如在用户登录页面。而Django以及配合django-simple-captcha模块可以非常轻松的实现图片验证码功能。

  1. 安装django-simple-captcha模块:

    pip install django-simple-captcha
    
  2. 在项目的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
    
  3. 在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)不能用字典的方式传参,而是直接用上述方法直接取相应的字段去数据库中进行查询。