为了防止机器人频繁登录网站或者破坏分子恶意登录, 很多用户登录和注册系统都提供了图形验证码功能.
验证码 (CAPTCHA) 是一种区分用户是计算机还是人的公共全自动程序.
可以防止恶意破解密码, 刷票, 论坛灌水, 有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试.
图形验证码的历史比较悠久, 到现在已经有点英雄末路的味道了. 因为机器学习, 图像识别的存在, 机器人已经可以比较正确的识别图像内的字符了.
但不管怎么说, 作为一种防御手段, 至少还是可以抵挡一些低级入门的攻击手段, 抬高了攻击者的门槛.
在 Django 中实现图片验证码功能非常简单, 有现成的第三方库可以使用. 这个库叫做 django-simple-captcha.
一, 安装 captcha
在 Pycharm 的 terminal 中, 首先进入 mysite_env 虚拟环境, 然后安装第三方库:
pip install django-simple-captcha
Django 自动帮我们安装了相关的依赖库 six,olefile 和 Pillow, 其中的 Pillow 是大名鼎鼎的绘图模块.
二, 注册 captcha
在 settings 中, 将'captcha'注册到 App 列表里:
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'login',
- 'captcha',
- ]
captcha 需要在数据库中建立自己的数据表, 所以需要执行 migrate 命令生成数据表:
python manage.py migrate
三, 添加 url 路由
在根目录下的 urls.py 文件中增加 captcha 对应的网址:
- from django.conf.urls import url
- from django.conf.urls import include
- from django.contrib import admin
- from login import views
- urlpatterns = [
- url(r'^admin/', admin.site.urls),
- url(r'^index/', views.index),
- url(r'^login/', views.login),
- url(r'^register/', views.register),
- url(r'^logout/', views.logout),
- url(r'^captcha', include('captcha.urls'))
- ]
由于使用了二级路由机制, 需要在顶部 from django.conf.urls import include
四, 修改 forms.py
如果上面都 OK 了, 就可以直接在我们的 forms.py 文件中添加 CaptchaField 了.
- from django import forms
- from captcha.fields import CaptchaField
- class UserForm(forms.Form):
- username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'}))
- password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))
- captcha = CaptchaField(label='验证码')
注意需要提前导入 from captcha.fields import CaptchaField, 然后就像写普通的 form 字段一样添加一个 captcha 字段就可以了!
五, 修改 login.html
由于我们前面是手动生成的 form 表单, 所以还要修改一下, 添加 captcha 的相关内容, 如下所示:
- {
- % extends 'login/../base.html' %
- }
- {
- % load staticfiles %
- }
{% block title %}登录{% endblock %}
- {% block CSS %}<link href="{% static'css/login.css'%}" rel="stylesheet"/>{% endblock %}
- {% block content %}
- <div class="container">
- <div class="col-md-4 col-md-offset-4">
- <form class='form-login' action="/login/" method="post">
- {% if message %}
- <div class="alert alert-warning">{{ message }}</div>
- {% endif %}
- {% csrf_token %}
- <h2 class="text-center">欢迎登录</h2>
- <div class="form-group">
- {{ login_form.username.label_tag }}
- {{ login_form.username}}
- </div>
- <div class="form-group">
- {{ login_form.password.label_tag }}
- {{ login_form.password }}
- </div>
- <div class="form-group">
- {{ login_form.captcha.errors }}
- {{ login_form.captcha.label_tag }}
- {{ login_form.captcha }}
- </div>
- <button type="reset" class="btn btn-default pull-left">重置</button>
- <button type="submit" class="btn btn-primary pull-right">提交</button>
- </form>
- </div>
- </div> <!-- /container -->
- {% endblock %}
这里额外增加了一条 {{ login_form.captcha.errors }} 用于明确指示用户, 你的验证码不正确.
六, 查看效果
重启服务器, 进入登录页面, 尝试用用户名错误, 密码不对, 验证码不对, 全对的不同情况, 看看我们新增的四位验证码的效果如何.
就是这么简单!
我们加入了一个防止机器人或者恶意登录的图形验证码功能, 虽然界面难看了点, 但底子是好的, 你可以根据需要进行美化.
其中验证图形码是否正确的工作都是在后台自动完成的, 只需要使用 is_valid()这个 forms 内置的验证方法就一起进行了, 完全不需要在视图函数中添加任何的验证代码, 非常方便快捷!
关于 captcha 的功能, 当然绝不仅限于此, 你可以设置六位, 八位验证码, 可以对图形噪点的生成模式进行定制, 这些就留待你自己学习和研究了.
来源: https://www.cnblogs.com/jinyuanliu/p/10534175.html