• Django之天天生鲜项目


    准备工作

    1、配置settings.py内置文件

    注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常

    2、创建应用

    3、配置主路由

    一、用户注册

    1、创建用户注册model模型

    1)设置模型抽象类

     2)进入user应用设置model

    这里使用的是django内部AbstractUser用户类

    2、显示用户注册页面

    方法一:使用FBV请求处理

    FBV:(function base views) 就是在视图里使用函数处理请求。

    1)定义路由

    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)

      

     

      

  • 相关阅读:
    MySQL-DQL查询语句的其他方法查询
    MySQL-SQL的分类以及基本的操作
    1-1-4-2 Java se-常量&变量-作用域
    1-1-4-1 java se-常量&变量-基本数据类型
    1-1-2-1 java se-helloworld原理—java代码的编译和运行逻辑
    1-1-1-2 Java se-java运行环境-jvm虚拟机的跨平台性以及和jdk,jre之间的关系
    1-1-1-1 java se-java运行环境-基本单位bit和Byte
    递归
    Ultra-QuickSort (POJ 2299)树状数组+离散化
    Color the ball(HDU1556)树状数组
  • 原文地址:https://www.cnblogs.com/renshaoqi/p/10511244.html
Copyright © 2020-2023  润新知