第四章 天天生鲜实现登录功能

第四章 天天生鲜实现登录功能


学习入门指南:

天天生鲜项目搭建文件可从公众号学聚思获取,关注公众号:学聚思、学聚思、学聚思。重要的事情说三遍

本文博客获取关键词:天天生鲜登录功能博客

本项目关键词:天天生鲜登录功能博客源码

请大家按照关键字搜索哦,另外,本人创建了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 * 				# 查看内容


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值