在实际开发中,我们会用到验证码
安装:
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.使用,在注册页面中使用:
{{ 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 %}
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
代码:
# _*_ 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
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]'
最后我注册是用的腾讯邮箱,最后你发现,在垃圾邮件看到:
10.注册用户时候总结和遇到一些问题:
1.问题:
MySQL错误:IntegrityError: (1062, "Duplicate entry '123' for key 'username'")
原因是数据库中重复插入某条数据时候就会报这个,其实在注册用户的时候,我们还要加一个验证,数据库中是否有注册过,如果注册过就不让注册
解决方法:
(1)删掉已经存在的值,重新插入。
(2)或者字段设置允许重复的值。
网上解决思路:
https://blog.csdn.net/cckavin/article/details/81611330
2.邮箱中开启: