第三章 天天生鲜项目实现注册异步收发功能
本文主要内容:实现注册异步收发功能
本设计不涉及中间过程,直接上手最后的功能,所以自己对着视频分模块学习,把这个整个模块学习完再导入下面的代码
本文中用到的Django的一些说明书
章节目录
第一步 代码入场
1、新建python包,然后在里面新建一个python文件celery_tasks.py,然后在里面导入如下内容:
#使用celery
from django.core.mail import send_mail
from django.conf import settings
from celery import Celery
import time
# 这个在任务处理者一端加入代码,也就是Linux下的该文档加下面的代码
# import os
# import django
# os.environ.setdefault("DJANGO_SETTINGS_MODULE","dailyfresh.settings")
# django.setup
#创建一个Celery类的实例对象
app=Celery('celery_tasks.tasks',broker='redis://192.168.23.150:6379/8')
#定义任务函数
@app.task
def send_register_active_email(to_email, username, token):
"'发送激活邮件'"
#组织邮件信息
subject = '天天生鲜欢迎信息'
message = '欢迎注册'
sender = settings.EMAIL_FROM # 发件人
receiver = [to_email]
html_message = '<h1>%s欢迎您成为为昌航二手交易市场注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>' % ( username, token, token)
send_mail(subject, message, sender, receiver, html_message=html_message)
2、在/user/views.py中使用如下内容,直接空白导入,不用刻意的去加,把之前的全部删了,把这个放进去就ok
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 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('激活链接已过期')
第二步、一些插件的安装
异步收发,两边都要安装插件celery:
# 第一步 ,在pycharm中安装插件celery
pip install celery
# 第二步 ,在pycharm中安装redis
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;
第三步 一些环境的配置
我们在linux下配置环境
redis的安装
这里我下载的是当前最新版本6.2.1,首先进入官网,找到网址,然后
wget http://download****
解压包
tar -zxvf redis-6.2.1.tar.gz
将包移动到安装目录下
sudo mv ./redis-6.2.1 /usr/local/redis
进入redis文件夹
cd /usr/local/redis/redis-6.2.1
生成
sudo make
测试
sudo make test
安装,将redis的命令安装到//bin目录
sudo make install
安装完成后,进入目录/usr/bin查看
cd /usr/local/bin
ls
配置文件,移动到/etc/目录下
sudo cp /usr/local/redis/redis.conf /etc/redis/
如果没有redis目录,使用下面指令创建目录
sudo mkdir redis
redis的配置
IP地址默认为127.0.0.1,端口默认6379
需要将守护进程运行的参数daemonize改为yes(默认为no)
启动的redis命令指令以及杀死指令以上面安装方法安装为准
1、启动服务端
sudo redis-server /etc/redis/redis.conf
2、查看redis是否启动
ps aux | grep redis
3、结束redis服务的运行
sudo kill -9 PID
4、连接redis
redis-cli
查看是否连接成功可以输入ping,则会回复pong(表示连接成功)
5、切换数据库(默认0)
select 5
select 0 # 返回默认数据库
6、redis为了实现与python以及后面的布局需要做的一些配置
pip install redis # 安装reids插件,使得redis可以和python交互
7、redis_redis存储和session信息的配置
django存储session需要做的一些配置
pip install django-redis-sessions #安装session的redis存储配置包
配置主从服务的主服务,也就是把redis放在虚拟机的linux上,然后Django在windows下跑
首先需要把ip地址换一下,不能使用默认的127.0.0.1,把她换成ifconfig命令下的IP地址,怎么更换呢?
#修改/etc/redis/redis.conf文件
sudo vim /etc/redis/redis.conf
bind 192.168.26.128 #这个把原来的127.0.0.1注释,然后换成ifconfig下的配置文件
# 把daemonize改为yes
demonize yes
#****************************************************************************
# 重启redis服务
sudo service reids stop
redis-server /etc/redis/redis.conf
第四步 基本操作
# 第一步,在虚拟机中启动celery
celery -A celery_tasks.tasks worker -l info