环境:Django版本3.2 python3.9
(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"
(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应用程序
图片验证码后端的校验,等到用户需要获取短信验证码的时候判断图片验证码是否正确 , 正确则可以发送短信验证码 ,否则不可以发送短信验证码。
(10)短信验证码
1、后端完成短信验证码
流程如下:
2、前端完成短信验证码
3、将前端页面中接收短信验证码的按钮实现倒计时状态
4、在后端中校验短信验证码
5、完善短信验证码发送功能
避免用户频繁的发送短信验证码
后端:在验证码的视图中添加标记表示用户刚才已经发送过验证码了 , 提示频繁发送