在實際開發中,我們會用到驗證碼
安裝:
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.郵箱中開啟: