一.项目的整体架构
二.用户模块
用户注册思路总结:
- 获取用户输入的信息(username,password,email)
- 校验数据(数据的完整性,emai邮箱格式是否正确)
- 查看数据库中是否已经存在用户输入的用户名,用get函数。
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# 用户名不存在
user = None # 重点在这里:小技巧
if user:
# 用户名已存在
return render(request, 'register.html', {'errmsg': '用户名已存在'})
- 将用户信息插入到数据库。用create_user函数。
- create_user函数的参数:username、password、email
- 认证系统默认的参数:is_active=True、is_staff=False、is_superuser=False
- 该函数将password用hash算法加密后存储到数据库中
- 将is_active的值设置为0,保存。为了用邮箱激活。
- 准备发送邮件的参数,用celery发送邮件。
- 先给用户的id进行加密,先导包
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 参数1:随便给一个字符串用来加密;参数2: 加解密的过期时间
serializer = Serializer(settings.SECRET_KEY,30)
# 将用户id加密,返回一个bytes类型,需要转换为字符串类型
token = serializer.dumps(user.id).decode()
- 在settings中配置celery的相关信息。
- 然后自定义一个celery任务函数,调用django中的send_email()函数。
- 最后用delay函数发送任务函数。
- 将注册信息保存到session中。
- 用django.contrib.auth包中的login方法,login有两个参数,request和user,user来自authenticate方法。
- 用login之前必须使用authenticate方法验证数据库中是否有用户信息。否则会抛出异常。
- 重定向到首页
用户登录思路总结:
- 获取用户输入的数据:username,password,allow
- 校验数据
- 查看数据库中是否包含账号和密码。
user = authenticate(username=username,password=password)
- 判断user是否为空,和账号是否激活。
- user不为空,账号被激活:
- 用
login(request,user)
方法将用户信息存储到session中。
- 判断allow记住用户名是否为on,是:将username放到cookie中;否:将cookie中的username删除。
- 跳转到首页
- 设置index.html的导航栏。
user.is_authenticated
判断用户是否登入,user.username
取出用户名。
- 否则,返回错误信息。
显示登录页面思路总结:
- 判断cookie中是否含有username。
- 含有:返回username,将checked的值设置为checked并返回。
- 没有:username和checked全部返回为空。