1、功能分析
輸入合法驗證、驗證碼生成:form.py
注冊:views.py
發送郵件功能:utils/email_send.py
2、把注冊register.html頁面復制到templats目錄下
3、安裝Django驗證碼生成庫
pip install django-simple-captcha=0.4.6
4、輸入合法驗證、驗證碼生成form.py
from django import forms from captcha.fields import CaptchaField #倒入驗證碼模塊 class RegisterForm(forms.Form): """注冊用戶驗證碼""" email = forms.EmailField(required=True) password = forms.CharField(required=True, min_length=8) # 最小長度8 captcha = CaptchaField(error_messages={'invalid': u'驗證碼錯誤'}) # 自定義錯誤提示信息
5、在user目錄下新建utils文件夾,在文件夾下建立向郵箱發送郵件文件email_send.py,實現注冊郵件發送功能:
from random import Random from django.core.mail import send_mail #發送郵件模塊 from users.models import EmailVerifyRecord from MxOnline.settings import EMAIL_FROM def random_str(randomlength=8): """生成隨機字符串""" str = '' chars = 'AaBbCcDdEdFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' length = len(chars) - 1 random = Random() for i in range(randomlength): str += chars[random.randint(0,length)] return str def send_register_email(email, send_type='register'): email_record = EmailVerifyRecord() code = random_str(16) # 16位長度的字符串 email_record.code = code email_record.email = email email_record.send_type = send_type email_record.save() #保存 email_title = '' email_body = '' if send_type == 'register': email_title = '注冊激活鏈接' email_body = '請點擊鏈接激活你的賬號:http://127.0.0.1:8000/active/{0}'.format(code) send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) # 發送郵件 if send_status: pass
6、在users/views.py文件中實現注冊激活
from django.shortcuts import render from django.views.generic.base import View from django.contrib.auth.hashers import make_password # 對密碼加密模塊 from .models import UserProfile, EmailVerifyRecord from .forms import RegisterForm from users.utils.email_send import send_register_email 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(): user_name = request.POST.get('email', '') if UserProfile.objects.filter(email=user_name): # 判斷郵箱是否已經存在 return render(request, "register.html", {'register_form': register_form, 'msg':'用戶已經注冊'}) pass_word = request.POST.get('password', '') user_profile = UserProfile() user_profile.username = user_name user_profile.email = user_name user_profile.is_active = False # 設置注冊的賬戶沒有激活 user_profile.password = make_password(pass_word) # 對密碼加密 user_profile.save() # 保存數據庫 send_register_email(user_name, 'register') return render(request, "login.html") else: return render(request, "register.html", {'register_form': register_form}) class ActiveUserView(View): """賬戶激活的View""" def get(self, request, active_code): all_records = EmailVerifyRecord.objects.filter(code=active_code) if all_records: for record in all_records: email = record.email user = UserProfile.objects.get(email=email) user.is_active = True user.save() else: # active_fail.html在templates中新建的一個文件body中就一個<p>鏈接失效!</p> return render(request, "active_fail.html", {}) return render(request, "login.html", {})
7、urls.py文件添加代碼
from django.conf.urls import url, includefrom django.views.generic import TemplateViewfrom users.views import LoginView, RegisterView, ActiveUserView urlpatterns = [ url(r'^register/$', RegisterView.as_view(), name='register'), # 注冊 url(r'^captcha/', include('captcha.urls')), # 驗證碼 url(r'^active/(?P<active_code>.*)/$', ActiveUserView.as_view(), name='user_active'), # 配置激活賬戶鏈接 ]
8、修改index與register.html
<a style="color:white" class="fr registerbtn" href="{% url 'register' %}">注冊</a> # href="{% url 'register' %}"
<!DOCTYPE html> <html> {% load staticfiles %} #添加 <link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}"> <link rel="stylesheet" type="text/css" href="{% static 'css/login.css' %}"> <li><a href=""><img width="483" height="472" src="{% static 'images/57a801860001c34b12000460.jpg' %}" /></a></li> <li><a href=""><img width="483" height="472" src="{% static 'images/57a801860001c34b12000460.jpg' %}" /></a></li> <li><a href=""><img width="483" height="472" src="{% static 'images/57a801860001c34b12000460.jpg' %}" /></a></li> <script src="{% static 'js/jquery.min.js' %}" type="text/javascript"></script> <script src="{% static 'js/unslider.js' %}" type="text/javascript"></script> <script src="{% static 'js/validateDialog.js' %}" type="text/javascript"></script> <script src="{% static 'js/login.js' %}" type="text/javascript"></script>
9、在settings.py中添加captcha,配置發送郵箱
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'users', # 注冊App 'operation', 'courses', 'organization', # 添加以下兩個app配置 'xadmin', 'crispy_forms', 'captcha', ]
# 郵箱發送者配置
EMAIL_HOST = 'smtp.sina.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'qq602906176@sina.com'
EMAIL_HOST_PASSWORD = 'mao228298'
EMAIL_USE_TLS = False
EMAIL_FROM = 'qq602906176@sina.com'
10、Tools->run manage.py Tas生成captcha相關數據表
輸入:makemigrations
輸入:migrate
11、register.html
<form id="email_register_form" method="post" action="{% url 'register' %}" autocomplete="off">
........
<div class="form-group marb8 captcha1 "> <label>驗 證 碼</label> {{ register_form.captcha }} #生成驗證碼輸入框與生成驗證碼圖片 </div> ........ {% csrf_token %} </form>
<div class="tab-form">
<form id="email_register_form" method="post" action="{% url 'register' %}" autocomplete="off">
<div class="form-group marb20 {% if register_form.errors.email %}errorput{% endif %}">
<label>郵 箱</label>
<input type="text" id="id_email" name="email" value="{{ register_form.email.value }}" placeholder="請輸入您的郵箱地址" />
</div>
<div class="form-group marb8 {% if register_form.errors.password %}errorput{% endif %}">
<label>密 碼</label>
<input type="password" id="id_password" name="password" value="{{ register_form.email.password }}" placeholder="請輸入6-20位非中文字符密碼" />
</div>
<div class="form-group marb8 captcha1 {% if register_form.errors.captcha %}errorput{% endif %}">
<label>驗 證 碼</label>
{{ register_form.captcha }}
</div>
<div class="error btns" id="jsEmailTips">{% for key,error in register_form.errors.items %}{{ error }}{% endfor %}{{ msg }}</div>
<div class="auto-box marb8">
</div>
<input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注冊並登錄" />
{% csrf_token %}
</form>