天天看點

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圖檔驗證碼