第四章 天天生鲜实现登录功能
学习入门指南:
天天生鲜项目搭建文件可从公众号学聚思获取,关注公众号:学聚思、学聚思、学聚思。重要的事情说三遍
本文博客获取关键词:天天生鲜登录功能博客
本项目关键词:天天生鲜登录功能博客源码
请大家按照关键字搜索哦,另外,本人创建了1个QQ群欢迎各位加入讨论
QQ群号:301666877
另外如果需要其他资源,比如视频中的工程文档,欢迎公众号留言
本内容持续更新直至天天生鲜项目完成!
本文主要内容:实现注册异步收发功能
本设计不涉及中间过程,直接上手最后的功能,所以自己对着视频分模块学习,把这个整个模块学习完再导入下面的代码
本文中用到的Django的一些说明书
章节目录
第一步 代码入场
1、将static文件夹下面的login.html复制到templates文件夹下面,然后输入如下内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
{% load static %}
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-登录</title>
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
</head>
<body>
<div class="login_top clearfix">
<a href="index.html" class="login_logo"><img src="{% static 'images/logo02.png' %}"></a>
</div>
<div class="login_form_bg">
<div class="login_form_wrap clearfix">
<div class="login_banner fl"></div>
<div class="slogan fl">日夜兼程 · 急速送达</div>
<div class="login_form fr">
<div class="login_title clearfix">
<h1>用户登录</h1>
<a href="#">立即注册</a>
</div>
<div class="form_input">
<form method="post">
{% csrf_token %}
<input type="text" name="username" class="name_input" placeholder="请输入用户名">
<div class="user_error">输入错误</div>
<input type="password" name="pwd" class="pass_input" placeholder="请输入密码">
<div class="pwd_error">输入错误</div>
<div class="more_input clearfix">
<input type="checkbox" name="remember">
<label>记住用户名</label>
<a href="#">忘记密码</a>
</div>
<input type="submit" name="" value="登录" class="input_submit">
</form>
</div>
</div>
</div>
</div>
{{ errmsg }}
<div class="footer no-mp">
<div class="foot_link">
<a href="#">关于我们</a>
<span>|</span>
<a href="#">联系我们</a>
<span>|</span>
<a href="#">招聘人才</a>
<span>|</span>
<a href="#">友情链接</a>
</div>
<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
<p>电话:010-****888 京ICP备*******8号</p>
</div>
</body>
</html>
2、user/views.py内容改为如下
from django.shortcuts import render,redirect
from django.urls import reverse #反向解析函数
from django.core.mail import send_mail #导入发送邮件函数
from django.views.generic import View #导入类视图
from django.http import HttpResponse
from django.conf import settings
from django.contrib.auth import authenticate,login,logout #分别导入django用户认证系统、记住登录状态模块函数login、退出模块logout
from user.models import User
from celery_tasks.tasks import send_register_active_email #导入发送邮件函数
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer #导入用于用户信息加密的插件并且给它取个别名为Serializer
from itsdangerous import SignatureExpired #导入异常
import re #导入正则匹配模块用于检验邮箱
# Create your views here.
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': '数据不完整'})
# 检验邮箱
re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email)
# 如果不是一个邮箱,即邮箱形式不合法
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.objects.get(username=username)
except User.DoesNotExist:
User.username = None
if User.username:
# 用户名已存在
return render(request, 'register.html', {'errmsg': '用户名已存在'})
# 进行业务处理:进行用户注册
user = User.objects.create_user(username, email, password)
user.is_active = 0 # 不让他自动激活
user.save()
#发送激活邮件,包含激活链接:
#激活连接中需要包含用户的身份信息,并且要把身份信息进行加密
#加密用户的身份信息,生成激活token
serializer=Serializer(settings.SECRET_KEY,3600)
info={'confirm':user.id}
token=serializer.dumps(info) #返回的是字节
token=token.decode() #进行字节解码
#发邮件
#出现阻塞暂时无法解决,故采用下面的函数
send_register_active_email.delay(email, username, token)
#send_register_active_email(email, username, token) #上面那个函数发生组赛了,用我
# 返回应答,跳转到index
return redirect(reverse('goods:index'))
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('激活链接已过期')
#/user/login
#用户登录模块
class LoginView(View):
"'登录'"
def get(self,request):
"'显示登录页面'"
#判断是否记住了用户名
if 'username' in request.COOKIES:
username=request.COOKIES.get('username')
checked='checked'
else:
username=''
checked=''
#使用模板
return render(request,'login.html',{'username':username,'checked':checked})
def post(self, request):
"'登录校验'"
#接收数据
username=request.POST.get('username')
password=request.POST.get('pwd')
#校验数据
if not all([username,password]):
return render(request,'login.html',{'errmsg':'数据不完整'})
#业务处理:登录校验
user = authenticate(username=username,password=password)
if user is not None:
#用户名密码正确
if user.is_active:
#用户已激活
# 记录登陆状态 session
login(request,user)
#获取登录后所要跳转的地址
return redirect(reverse('goods:index'))
#判断用户是否需要记住用户名
#跳转到首页
#用户未激活
return render(request,'login.html',{'errmsg':'账户未激活'})
else:
#用户账户或密码错误
return render(request,'login.html',{'errmsg':'用户名或密码错误',"login_form":login_form})
#返回应答
3、在user/urls.py中添加如下内容
from django.urls import path,re_path
from user.views import RegisterView,ActiveView,LoginView
urlpatterns = [
path('register',RegisterView.as_view(),name='register'), #注册
re_path('active/(?P<token>.*)$',ActiveView.as_view(),name='active'), #用户激活
path('login',LoginView.as_view(),name='login'), #登陆
]
第二步、一些插件的安装
使用session存储,我们需要安装插件
# 第一步 安装session插件
pip install django-redis
linux与windows下共享文件夹设置
首先在Windows随便建个文件夹并命名,我把它命名为share,然后打开虚拟机的设置,然后点选项,启用共享文件夹,添加我们建立的目录,然后到linux下终端输入如下信息
# 第一步 打开共享文件夹
cd /mnt/hgfs/
# 第二步 把我们需要的文件放进共享文件夹
#第三步 查看共享文件夹是否有内容
ls
#第四步 把共享文件夹中的内容复制到我们想要的目录下
sudo cp -r /mnt/hgfs/share/dailyfresh_version1/ /home/lyj/桌面
# 删除一个空目录
sudo rmdir 文件名
sudo rm -rf 文件名 # 删除一个非空目录
mysql数据库应用小技巧
# 1、如何删除数据库中某个表中的数据,比如从df_user表中删除id=1的用户
delete from df_user where id=1
# 2、查看df_user表中的全部数据
select * from df_user;
select * from df_user \G; #这个可以让数据一行行的展示
# 3、如何查看表的结构,比如df_user表
desc df_user;
第三步 一些环境的配置
1、我们需要到settings中做如下配置
#django的缓存配置,使用redis
CACHES={
"default":{
"BACKEND":"django_redis.cache.RedisCache",
"LOCATION":"redis://192.168.23.150:6379/9",
"OPTIONS":{
"CLIENT_CLASS":"django_redis.client.DefaultClient",
}
}
}
#配置session存储
SESSION_ENGINE="django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS="default"
第四步 基本操作
# 第一步,在linux下执行如下操作
redis-cli -h 自己的ip
select 9 # 选择数据库
keys * # 查看内容