安装captcha

  1. pip3.6 install django-simple-captcha==0.4.6

settings.py中引入captcha

  1. INSTALLED_APPS = [
  2. \'django.contrib.admin\',
  3. \'django.contrib.auth\',
  4. \'django.contrib.contenttypes\',
  5. \'django.contrib.sessions\',
  6. \'django.contrib.messages\',
  7. \'django.contrib.staticfiles\',
  8. \'captcha\',
  9. ]

url.py配置

  1. from django.conf.urls import url, include
  2. from django.contrib import admin
  3. urlpatterns = [
  4. url(r\'^admin/\', admin.site.urls),
  5. url(r\'^captcha/\', include(\'captcha.urls\')),
  6. ]

数据库同步

  1. makemigrations
  2. migrate

效果

定义forms.py

  1. from django import forms
  2. from captcha.fields import CaptchaField
  3. #对表单进行判断
  4. class RegisterForm(forms.Form):
  5. email = forms.EmailField(required=True)
  6. password = forms.CharField(required=True,min_length=5)
  7. captcha = CaptchaField(error_messages={"invalid":"验证码错误"}) #加入这条

views.py

  1. from django.views.generic.base import View
  1. from .forms import RegisterForm
  1.  
  1. from django.shortcuts import render,HttpResponse

  1. \'\'\'
    注册账户\'\'\'
  2. class RegisterView(View):
  3. #显示注册页面
  4. def get(self,request):
  5. #把form传给前端,里边是验证码需要在前端显示
  6. register_form = RegisterForm()
  7. return render(request,\'register.html\',{\'register_form\':register_form})
  8. #接收提交的数据,进行逻辑判断
  9. def post(self,request):
  10. register_form = RegisterForm(request.POST)
  11. if register_form.is_valid():
  12. user_name = request.POST.get(\'email\', \'\')
  13. #去库里查询有没有这个邮箱,有就是已经注册过了
  14. if UserProfile.objects.filter(email=user_name):
  15. return render(request,\'register.html\',{\'register_form\':register_form,\'msg\':\'用户已经存在\'})
  16. #没有就是新用户,继续流程
  17. else:
  18. #获取前端填的表单,写进user库里
  19. pass_word = request.POST.get(\'password\', \'\')
  20. user_profile = UserProfile()
  21. user_profile.username = user_name
  22. user_profile.email = user_name
  23. user_profile.password = make_password(pass_word) #加密密码之后再存入库
  24. user_profile.save()
  25. send_register_email(user_name,\'register\')
  26. return render(request,\'login.html\')
  27. else:
  28. return render(request,\'register.html\',{\'register_form\':register_form})#把register_form传给前端是因为 这里包含错误信息,需要在前端显示

HTML页面引用验证码

  1. <div class="tab-form">
  2. <form id="email_register_form" method="post" action="{% url \'register\' %}" autocomplete="off">
  3. <input type=\'hidden\' name=\'csrfmiddlewaretoken\' value=\'gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ\' />
  4. <div class="form-group marb20 {% if register_form.errors.email %} errorput {% endif %}">
  5. <label>邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱</label>
  6. <input type="text" id="id_email" name="email" value="None" placeholder="请输入您的邮箱地址" />
  7. </div>
  8. <div class="form-group marb8 {% if register_form.errors.password %} errorput {% endif %}">
  9. <label>密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码</label>
  10. <input type="password" id="id_password" name="password" value="None" placeholder="请输入6-20位非中文字符密码" />
  11. </div>
  12. <div class="form-group marb8 captcha1 {% if register_form.errors.captcha %} errorput {% endif %} ">
  13. <label>验&nbsp;证&nbsp;码</label>
  14. {{ register_form.captcha }} #加入这条
  15. </div>
  16. <div class="error btns" id="jsEmailTips">
  17. {% for key, error in register_form.errors.items %}
  18. {{ error }}
  19. {% endfor %}
  20. {{ msg }}
  21. </div>
  22. <div class="auto-box marb8">
  23. </div>
  24. <input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册并登录" />
  25. {% csrf_token %}
  26. </form>
  27. </div>

流程:

1.在这个页面,填完邮箱,密码,验证码后提交表单

2.把表单数据交给django-form验证

3.forms.py的RegisterForm中email和password字段验证输入的数据符不符合forms中定义的格式要求(密码是不是小于5位之类的),captcha验证验证码输入是否正确,注意是不一样的

4.验证码的输入框和图片是captcha自动生成的 

版权声明:本文为chadiandianwenrou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chadiandianwenrou/p/7570180.html