Django电商项目用户注册开发流程

Django电商项目用户注册开发流程

  • 1、配置setting.py文件
  • 2、用户注册

环境:Django版本3.2 python3.9

1、配置setting.py文件

(1)首先在setting.py里面配置数据库
例如MySQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'USER': "root",
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'NAME': '' # 填写数据库名
    }
}

(2)在setting.py配置文件里面配置static(静态文件)地址

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

(3)配置redis缓存 将session缓存修改到redis中 保存会话记录 维持登录状态

# redis缓存
CACHES = {
    'default' : {
        "BACKEND" : "django_redis.cache.RedisCache",
        "LOCATION" : "redis://127.0.0.1:6379/0",
        "OPTIONS" : {
            "CLIENT_CLASS" : "django_redis.client.DefaultClient",
        }
    },
    
    "session" : {
        "BACKEND" : "django_redis.cache.RedisCache",
        "LOCATION" : "redis://127.0.0.1:6379/1",
        "OPTIONS" : {
            "CLIENT_CLASS" : "django_redis.client.DefaultClient",
        }
    },
    
}
# 指定会话引擎 Django将使用缓存来存储会话数据
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 指定了要使用的缓存别名 alias别名
SESSION_CACHE_ALIAS = "session"

2、用户注册

效果展示
Django电商项目用户注册开发流程_第1张图片

(1)新建应用实现用户的实现逻辑,到配置文件中注册,到urls中分发路由(include)。

(2)进行基本响应注册页面视图

(3)配置用户注册路由

(4)定义用户数据模型类(使用auth模块实现保存用户数据 , 自定义认证模型类)
修改django默认的认证模型 , 到配置文件中添加:

# 配置自定义模型类
# 设置了AUTH_USER_MODEL,就不能再使用内置的User模型(django默认认证模型)进行用户认证和管理
AUTH_USER_MODEL = 'users.User'

自定义模型类扩展好之后,就可以进行数据迁移
python manage.py makemigrations
python manage.py migrate

(5)后端数据校验
认为写了前端效验就不写后端的想法是错误的 因为浏览器可能会过滤掉前端效验 但是在后端浏览器是看不到的 是一定会进行的

实现用户提交之后的数据 , 在django中对数据是否合格的校验。用自定义forms表单类进行数据校验.

在应用中穿件forms模块进行实现。
例如

from django import forms

class RegisterForm(forms.Form):
    '''
    效验用户的注册数据是否合格
    '''
    username = forms.CharField(max_length=15 , min_length=5,
                               error_messages={
                                   'max_length':'用户名过长,最长为15位',
                                   'min_length':'用户名过短,最短为5位',
                                   'required':'用户名不能为空'
                               })
    password = forms.CharField(max_length=20, min_length=6,
                               error_messages={
                                   'max_length': '密码过长,最长为20位',
                                   'min_length': '密码过短,最短为6位',
                                   'required': '密码不能为空'
                               })
    password2 = forms.CharField(max_length=20, min_length=6,
                               error_messages={
                                   'max_length': '密码过长,最长为20位',
                                   'min_length': '密码过短,最短为6 位',
                                   'required': '密码不能为空'
                               })
    mobile = forms.CharField(max_length=11, min_length=11,
                                error_messages={
                                    'max_length': '手机号不正确',
                                    'min_length': '手机号不正确',
                                    'required': '手机号不能为空'
                                })
    # 当表单的is_valid方法被调用时,clean方法会被自动调用,用于自定义的数据验证和清洗。
    def clean(self):
        '''
        效验两次密码是否一致
        '''
        # 首先调用了super().clean()获取父类的验证和清洗后的数据,然后在这个基础上进行进一步的验证或处理
        # 父类forms.Form 或 forms.ModelForm 的 clean() 方法
        clean_data = super().clean()

        pw = clean_data.get('password')
        pw2 = clean_data.get('password2')
        if pw != pw2:
            raise forms.ValidationError('密码输入不一致')
        return clean_data

经过视图将用户提交的数据传递到自定义的form表单类中。

注册视图:进行判断数据是否合法 , 合法则将数据保存到数据库中注册成功 , 否则注册失败。

    def post(self , request):
        # 效验用户注册数据
        register_form = RegisterForm(request.POST)

        # 效验数据是否合法
        if register_form.is_valid():
            # 在clean()方法中,可以访问表单数据,并对数据进行验证和清洗,然后将验证后的数据存储在cleaned_data中
            # 因此,clean()方法和cleaned_data属性是配合使用的,前者用于定义验证逻辑,后者用于存储验证后的数据
            username = register_form.cleaned_data.get('username')
            password = register_form.cleaned_data.get('password')
            mobile = register_form.cleaned_data.get('mobile')

            # 将数据保存到数据库中
            user = User.objects.create_user(username=username , password=password , mobile=mobile)

(6)前端数据校验
在前端中进行数据校验,一般使用vue/reate框架进行动态绑定处理

(7)状态保持
如果用户注册成功 , 通过认证用户的唯一标识写入到的当前浏览器的cookie和服务端的session中

from django.contrib.auth import login

在注册视图中的post请求方法中添加

login(request , user)

(8)校验用户名重复

首先 后端处理:在实现视图中 , 从数据库的用户信息表中查询这个用户名是否存在。

class UsernameCountView(View):
    '''
    判断用户名是否重复
    '''
    def get(self , request , username):
        # 从数据库中获取数据
        count = User.objects.filter(username=username).count()
        # 将数据返回到前端的ajax请求中
        # ajax 请求接收的是json类型的数据
        return JsonResponse({'code':200 , 'errmsg':'OK' , 'count':count})

前端中对用户名进行校验


    // 判断用户是否重复
    // 前提保证用户名合法
    if(this.error_name == false){
        // 发送ajax请求
        let url = '/user/username/'+ this.username +'/count/';
        axios.get(
            url , {responseType :'json'}
        )
        // 请求成功
            .then(response => {
            // 获取后端传递过来的数据 response.data
            if(response.data.count == 1){
                // 用户已存在
                this.error_name_message = '用户名已存在';
                this.error_name = true;
            } else {
                this.error_name = false;
            }
        })
        // 请求失败
            .catch(error =>{
            console.log(error.response)
        })
    }

(9)图形验证码(可选)
因为验证是会多变 , 将验证码的操作功能单独放在一个应用中进行实现。
需要创建一个新的python应用程序

  • 请求图片验证码
  • 接收请求
  • 提取参数
  • 校验参数(因为用户还没注册 , 服务器不知道用户是哪个,要使用uuid , uuid是一个通用的标识符。)
  • 保存验证码

图片验证码后端的校验,等到用户需要获取短信验证码的时候判断图片验证码是否正确 , 正确则可以发送短信验证码 ,否则不可以发送短信验证码。

(10)短信验证码

1、后端完成短信验证码
流程如下:

  • 接收请求
  • 校验请求参数(手机,uuid , 图片验证码)
  • 提取图片验证码
  • 删除图片验证码
  • 校验图片验证码
  • 生成短信验证码
  • 发送短信验证码
  • 保存短信验证码
  • 响应

2、前端完成短信验证码

  • 对短信验证码的标签进行事件绑定
  • 添加发送短信验证码的请求

3、将前端页面中接收短信验证码的按钮实现倒计时状态

4、在后端中校验短信验证码

5、完善短信验证码发送功能

避免用户频繁的发送短信验证码
后端:在验证码的视图中添加标记表示用户刚才已经发送过验证码了 , 提示频繁发送

你可能感兴趣的:(django,python)