天天看点

Django图片验证码

在实际开发中,我们会用到验证码

安装:

1.执行命令:pip install django-simple-captcha
           

2.注册,settings.py 注册captcha APP:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user',
    'course',
    "organization",
    "operation",
    "xadmin",
    "crispy_forms",
    "reversion",
    "captcha"
]
           

3.创建验证码表

makemigrations migrations,就会发现数据库中出现captcha开头的表

4.导入url,在项目中urls.py

from django.contrib import admin
from django.urls import path,include
from django.views.generic import TemplateView
from user.views import LoginView
from user.views import RegisterView
import xadmin

urlpatterns = [
    # xadmin,首页
    path('xadmin/', xadmin.site.urls),
    path('', TemplateView.as_view(template_name="index.html"), name="index"),
    path('login/', LoginView.as_view(), name="login"),
    path('register/', RegisterView.as_view(), name="register"),
    path('captcha/', include('captcha.urls'))
]

           

注意一定要

from django.urls import path,include
           

5.include 用法主要是导入第三方包

使用文档:

https://django-simple-captcha.readthedocs.io/en/latest/

6.使用,在注册页面中使用:

Django图片验证码
{{ register_form.captcha }}
           

为什么要在注册的HTML中声明这个因为在请求这个页面的时候,RegisterForm就会返回一段验证码的HTML标签放在注册页面验证码那块,然后我们就可以看到我们的验证码了

class RegisterView(View):
    def get(self, request):
        register_form = RegisterForm()
        return render(request, "register.html", {'register_form': register_form})
           

7.表单提交路径设置方法,下面这种写法就是制定到我们register路由中

<form id="email_register_form" method="post" action="{% url 'register' %}l" autocomplete="off">
           

8.提交表单时候会报一个 403,需要添加 {% csrf_token %}

{% csrf_token %}
           
Django图片验证码

9.开始准备写注册后台逻辑

class RegisterView(View):
    def get(self, request):
        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():
            pass_word = request.POST.get("password", "")
            email = request.POST.get("email", "")
            userInfo = UserInfo()
            userInfo.email = email
            userInfo.username = email
            userInfo.password = make_password(pass_word)
            userInfo.save()
            send_state = send_register_email(email, "register")
            # return render(request, "index.html")

        else:
            return render(request, "register.html", {'register_form': register_form})
           

注册,注册页面路由:

path('register/', RegisterView.as_view(), name="register"),
           

补充注册send_register_email 方法

在user APP新建 email_send.py

Django图片验证码

代码:

# _*_ encoding:utf-8 _*_

from user.models import VerificationCode
from random import Random
from mxteaching.settings import EMAIL_FROM
from django.core.mail import send_mail


def getCode(codelegth):
    str = ''
    chars = "QWERTYUIOPASDFGHJKLZXCVBNMqweertyuiopasdfghjklzxcvbnm"
    legth = len(chars) - 1
    random = Random()
    for i in range(codelegth):
        str += chars[random.randint(0, legth)]
    return str


def send_register_email(email, send_type="register"):
    # 生成随机验证码code,然后将邮箱,发送类型,保存到验证码表中
    email_code = VerificationCode()
    email_code.email = email
    email_code.send_type = send_type
    code = getCode(16)
    email_code.code = code
    email_code.save()

    email_title = ""
    email_body = ""
    if send_type == "register":
        # 发送验证码
        email_title = "慕课网在线学习注册激活链接"
        email_body = "请点击下面链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code)
        # 发送邮箱send_mail
        send_state = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_state:
            pass

           
Django图片验证码

settings.py,关于邮箱配置

# 邮件配置
#新浪邮箱服务器地址
EMAIL_HOST = 'smtp.sina.com'
# smtp服务端口,默认为25
EMAIL_PORT = 25
# 邮箱名字
EMAIL_HOST_USER = '[email protected]'
# 密码
EMAIL_HOST_PASSWORD = 'xx'
# 默认false
EMAIL_USE_TLS = False
# 跟邮箱名保持一致
EMAIL_FROM = '[email protected]'
           

最后我注册是用的腾讯邮箱,最后你发现,在垃圾邮件看到:

Django图片验证码

10.注册用户时候总结和遇到一些问题:

1.问题:

MySQL错误:IntegrityError: (1062, "Duplicate entry '123' for key 'username'")
           

原因是数据库中重复插入某条数据时候就会报这个,其实在注册用户的时候,我们还要加一个验证,数据库中是否有注册过,如果注册过就不让注册

解决方法:

(1)删掉已经存在的值,重新插入。

(2)或者字段设置允许重复的值。

网上解决思路:

https://blog.csdn.net/cckavin/article/details/81611330

2.邮箱中开启:

Django图片验证码