Django之每天生鮮項目

準備工做

一、配置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)
相關文章
相關標籤/搜索