Django学习系列之captcha 验证码插件

安装部署

安装captcha

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

settings.py中引入captcha

INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘captcha‘,
]

url.py配置

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^captcha/‘, include(‘captcha.urls‘)),
]

数据库同步

makemigrations
migrate

应用

效果

定义forms.py

from django import forms

from captcha.fields import CaptchaField

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

views.py

from django.views.generic.base import View
from .forms import RegisterForm

from django.shortcuts import render,HttpResponse
‘‘‘注册账户‘‘‘
class RegisterView(View):
    #显示注册页面
    def get(self,request):
        #把form传给前端,里边是验证码需要在前端显示
        register_form = RegisterForm()
        return render(request,‘register.html‘,{‘register_form‘:register_form})
    #接收提交的数据,进行逻辑判断
    def post(self,request):
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            user_name = request.POST.get(‘email‘, ‘‘)
            #去库里查询有没有这个邮箱,有就是已经注册过了
            if UserProfile.objects.filter(email=user_name):
                return render(request,‘register.html‘,{‘register_form‘:register_form,‘msg‘:‘用户已经存在‘})
            #没有就是新用户,继续流程
            else:
                #获取前端填的表单,写进user库里
                pass_word = request.POST.get(‘password‘, ‘‘)
                user_profile = UserProfile()
                user_profile.username = user_name
                user_profile.email = user_name
                user_profile.password = make_password(pass_word) #加密密码之后再存入库
                user_profile.save()

            send_register_email(user_name,‘register‘)
            return  render(request,‘login.html‘)
        else:
            return render(request,‘register.html‘,{‘register_form‘:register_form})#把register_form传给前端是因为 这里包含错误信息,需要在前端显示

HTML页面引用验证码

<div class="tab-form">
                    <form id="email_register_form" method="post" action="{% url ‘register‘ %}" autocomplete="off">
                        <input type=‘hidden‘ name=‘csrfmiddlewaretoken‘ value=‘gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ‘ />
                        <div class="form-group marb20 {% if register_form.errors.email %} errorput {% endif %}">
                            <label>邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱</label>
                            <input  type="text" id="id_email" name="email" value="None" placeholder="请输入您的邮箱地址" />
                        </div>
                        <div class="form-group marb8 {% if register_form.errors.password %} errorput {% endif %}">
                            <label>密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码</label>
                            <input type="password" id="id_password" name="password"  value="None" placeholder="请输入6-20位非中文字符密码" />
                        </div>
                        <div class="form-group marb8 captcha1 {% if register_form.errors.captcha %} errorput {% endif %} ">
                            <label>验&nbsp;证&nbsp;码</label>
                            {{ register_form.captcha }}  #加入这条
                        </div>
                        <div class="error btns" id="jsEmailTips">
                            {% for key, error in register_form.errors.items %}
                                {{ error }}
                            {% endfor %}
                            {{ msg }}
                        </div>
                        <div class="auto-box marb8">
                        </div>
                        <input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册并登录" />
                        {% csrf_token %}
                    </form>
                </div>

流程:

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

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

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

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

时间: 2024-10-14 05:24:35

Django学习系列之captcha 验证码插件的相关文章

Django学习系列之django restframework

曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful API对资源进行操作Django中有一些可选的REST framework,比如django-piston,django-tasypie. 但是我和google(呵呵,不好意思)推荐这个:Django REST framework django-framework就是定义一个url,可以利用这个url

Django学习系列之中间件

中间件的定义 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类 django请求生命周期 自定义中间件 process_request(self,request): 请求到达之后之后先执行这个中间件 process_view(self, request, callback, callback_args, callback_kwargs): process_exception(self, requ

Django学习系列之ORM-QuerySetAPI

基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = models.Tb1(c1='xx', c2='oo') obj.save() dic = {'c1':'xx','c2':'oo'} models.Tb1.objects.create(**dic) #Form的产出结果是一个字典,可以根据这个Form的字典和**直接在数据库创建数据 # 查 models.Tb1.obje

Django学习系列之Form表单和ajax

ajax 通过ajax发送一条数据 定义urls.py from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^ajax_demo/', views.ajax_demo), ] 定义views.py from django.shortcuts import render from django.shortcuts import H

Django学习系列之路由系统

一.基于App的路由 作用: 根据App对路由规则进行分类,在全局urls.py包含某个项目的urls.py 示例 定义全局urls.py(全局路由系统) #导入include from django.conf.urls import url,include from django.contrib import admin #导入app下的view函数 from learn import views urlpatterns = [ url(r'^admin/', admin.site.urls)

Django学习系列之模型

Django ORM简介 介绍 关系对象映射(Object Relational Mapping) Django中遵循Code first的原则,即根据代码中定义的类生成数据库 ORM中: 我们写的类表示数据库的表名 根据这个类创建的对象是表结构 Django ORM 一对多关系例子 定义urls.py from django.conf.urls import url from django.contrib import admin #导入django admin admin.autodisco

Django学习系列之CSRF

Django CSRF 什么是CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果 某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求, 你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的 Django提供的CSRF防护机制 django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 t

Django学习系列之基础

Django介绍 Django简介 Django是一个基于MVC构造的框架.但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model).模板(Template)和视图(Views),称为 MTV模式,它们各自的职责如下: 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取.如何验证有效性.包含哪些行为以及数据之间的关系等 视图(View),即表现层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示;模型与模板的桥

Django学习系列之模板系统

一.模板标签 if/else {%  if  %}标签检查一个变量的值是否为真或者等于另外一个值,如果为真,系统会执行{%  if  %}和{%  endif  %}之间的代码块,例如: {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% endif %} {%  else  %}标签是可选的,如果不为真则执行{%  else  %}和{%  endif  %}之间的代码块 注意:一定要用{%  endif  %}