準備工做
一、配置settings.py內置文件html
注意: AUTH_USER_MODEL配置參數要在第一次遷移數據庫以前配置,不然可能django的認證系統工做不正常python
二、建立應用數據庫
三、配置主路由django
1、用戶註冊
一、建立用戶註冊model模型
1)設置模型抽象類服務器
2)進入user應用設置model函數
這裏使用的是django內部AbstractUser用戶類post
二、顯示用戶註冊頁面
方法一:使用FBV請求處理網站
FBV:(function base views) 就是在視圖裏使用函數處理請求。加密
1)定義路由url
import . import views url(r'^register$', views.register, name='register')
2)定義註冊的視圖函數
import re from django.shortcuts import render, redirect from .models import User from django.core.urlresolvers import reverse def register(request): '''顯示註冊頁面''' if request.method == 'GET': return render(request, 'register.html') else: username = request.POST.get('user_name') password = request.POST.get('pwd') email = request.POST.get('email') allow = request.POST.get('allow') # 進行數據校驗 if not all([username, password, email]): # 數據不完整 return render(request, 'register.html', {'errmsg': '數據不完整'}) # 郵箱校驗 if not re.match(r'^[a-z0-9][\w\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email): return render(request, 'register.html', {'errmsg': '郵箱格式不正確'}) # 每天生鮮協議校驗 if allow != 'on': return render(request, 'register.html', {'errmsg': '請贊成協議'}) # 校驗用戶名是否重複 try: user = User.objects.get(username=username) except User.DoesNotExist: # 用戶名不存在 user = None if user: # 用戶名以存在 return render(request, 'register.html', {'errmsg': '用戶名已存在'}) # 進行業務處理:用戶註冊 user = User.objects.create_user(username, email, password) user.is_active = 0 user.save() # 返回應答,跳轉到首頁 return redirect(reverse('goods:index'))
方法二:使用CBV請求處理(推薦)
CBV(class base views) 就是在視圖裏使用類處理請求。
1)定義路由
url(r'^register$', RegisterView.as_view(), name='register'), # 註冊
2)定義註冊視圖類
import re from django.shortcuts import render, redirect from .models import User from django.core.urlresolvers import reverse from django.views.generic import View from django.conf import settings from django.http import HttpResponse class RegisterView(View): """註冊""" def get(self, request): """顯示註冊頁面""" return render(request, 'register.html') def post(self, request): """進行註冊處理""" # 接收數據 username = request.POST.get('user_name') password = request.POST.get('pwd') email = request.POST.get('email') allow = request.POST.get('allow') # 進行數據校驗 if not all([username, password, email]): # 數據不完整 return render(request, 'register.html', {'errmsg': '數據不完整'}) # 郵箱校驗 if not re.match(r'^[a-z0-9][\w\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email): return render(request, 'register.html', {'errmsg': '郵箱格式不正確'}) # 每天生鮮協議校驗 if allow != 'on': return render(request, 'register.html', {'errmsg': '請贊成協議'}) # 校驗用戶名是否重複 try: user = User.objects.get(username=username) except User.DoesNotExist: # 用戶名不存在 user = None if user: # 用戶名以存在 return render(request, 'register.html', {'errmsg': '用戶名已存在'}) # 進行業務處理:用戶註冊 user = User.objects.create_user(username, email, password) user.is_active = 0 user.save() # 返回應答,跳轉到首頁 return redirect(reverse('goods:index'))
3)激活郵箱
1)下載加密簽名數據包
2)設置路由,編寫代碼邏輯
class ActiveView(View): """用戶激活""" def get(self, request, token): """進行用戶激活""" # 進行解密 獲取要激活的用戶信息 serializer = Serializer(settings.SECRET_KEY, 3600) try: info = serializer.loads(token) # 獲取待激活用戶的id user_id = info['confirm'] # 根據id獲取用戶信息 user = User.objects.get(id=user_id) user.is_active = 1 user.save() # 跳轉到登陸頁面 return redirect(reverse('user:login')) except SignatureExpired as e: # 激活連接已過時 return HttpResponse('激活連接已過時')
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, SignatureExpired from django.core.mail import send_mail # 發送激活郵件 包含激活連接:Http://127.0.0.1:8000/user/active/3 # 激活連接中須要包含用戶的身份信息 而且要把身份信息進行加密 # 加密用戶的身份信息 生成激活token class Register(View):
...
serializer = Serializer(settings.SECRET_KEY, 3600) info = {'confirm': user.id} token = serializer.dumps(info) token = token.decode('utf-8')
4)發送郵箱
流程:Django網站--->smtp服務器--->目的郵箱
配置settings.py
class Register(View): ... # 發郵箱 subject = '每天生鮮歡迎信息' message = '郵件正文' sender = settings.EMAIL_FROM receiver = [email] html_message = f'<h1>{username},歡迎您成爲每天生鮮註冊會員</h1>請點擊下面連接激活您的帳戶' \ f'<a href="http://127.0.0.1:8000/user/active/{token}">http://127.0.0.1:8000/user/active/{token}</a>' send_mail(subject, message, sender, receiver, html_message=html_message)