热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

celery使用发送邮件激活

Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题,使用非常简单。celery看起来似乎很庞大,本章节我们先对其进行简单的了解,然后再去学习其他一些高级特

Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题,使用非常简单。celery看起来似乎很庞大,本章节我们先对其进行简单的了解,然后再去学习其他一些高级特性。 celery适用异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。 celery的特点是:


  • 简单,易于使用和维护,有丰富的文档。

  • 高效,单个celery进程每分钟可以处理数百万个任务。

  • 灵活,celery中几乎每个部分都可以自定义扩展

?任务队列是一种跨线程、跨机器工作的一种机制.

??任务队列中包含称作任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理.

??celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者客户端)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。

??一个celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。

       Broker(中间人):RabbitMQ和Redis

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
‘‘‘用户模型类‘‘‘
class Meta:
db_table
= fm_user
verbose_name
= 用户
verbose_name_plural
= verbose_name

 

setting.py

#认证模型类
AUTH_USER_MODEL = "app01.User"
#发送邮件配置
EMAIL_BACKEND = django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST
= smtp.qq.com
EMAIL_PORT
= 25
#发送邮件的邮箱
EMAIL_HOST_USER = chvv1016@qq.com
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = xxxxxxxxx
#收件人看到的发件人
EMAIL_FROM = 天猫商城

创建一个celery_tasks的python包文件,然后创建一个tasks.py文件

from celery import Celery
from django.conf import settings
from django.core.mail import send_mail
import time
#django环境初始化
#
下面四句加到任务处理者一段,即ubuntu里面的任务处理者,ubuntu作为处理者,要把全部代码复制过去
#
ubuntu中启动命令 celery -A celery_tasks.tasks worker -l info
import os
import django
os.environ.setdefault(
"DJANGO_SETTINGS_MODULE", "celery_demo.settings")
django.setup()
# 创建一个celery的实例对象
app = Celery("celery_tasks.tasks",broker=redis://:chenchen@192.168.170.141:6379/8)
#定义任务函数
@app.task
def send_register_active_email(to_email,username,token):
#发送激活邮件
subject = "天猫商城欢迎你"
message
= ‘‘
sender
= settings.EMAIL_FROM
receiver
= [to_email]
html_message
= "

%s欢迎成为会员

请点击以下链接激活账户
http://127.0.0.1:8000/active/%s" % (
username, token, token)
send_mail(subject, message, sender, receiver, html_message
=html_message)
time.sleep(
3)

views.py

from django.shortcuts import render,redirect,HttpResponse
from django.core.urlresolvers import reverse
from django.views.generic import View
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
from django.conf import settings
from celery_tasks.tasks import send_register_active_email
from app01.models import User
from django.contrib.auth import authenticate,login,logout
import re
# Create your views here.
##########注册第一种FBV模式#########
#
注册和注册处理合一起
def register1(request):
if request.method == "GET":
return render(request,register.html)
else:
username
= request.POST.get("user_name")
password
= request.POST.get("pwd")
re_password
= request.POST.get("cpwd")
email
= request.POST.get("email")
allow
= request.POST.get("allow")
if not all([username, password, re_password, email]):
return render(request, register.html, {"errmsg": 数据不完整})
# 第一种校验用户名
# name_exist= models.User.objects.filter(username=username)
# if name_exist:
# return render(request, ‘register.html‘, {"error": ‘用户名已存在‘})
# 第二种校验用户名
try:
user
= User.objects.get(username=username)
except User.DoesNotExist:
# 用户名不存在
user = None
if user:
return render(request, register.html, {"errmsg": 用户名已存在})
if not re.match(r^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$, email):
return render(request, register.html, {"error": 邮箱格式不正确})
if allow != "on":
return render(request, register.html, {"errmsg": 请同意协议})
user
= User.objects.create_user(username=username, password=password, email=email)
# django内置的user中有一个is_active,注册成功默认激活,这里不认他激活
user.is_active = 0
user.save()
return redirect(reverse(goods:index))
#注册和注册处理分开写
#
def register_handle(request):
#
username = request.POST.get("user_name")
#
password = request.POST.get("pwd")
#
re_password = request.POST.get("cpwd")
#
email = request.POST.get("email")
#
allow = request.POST.get("allow")
#
#
if not all([username,password,re_password,email]):
#
return render(request,‘register.html‘,{"error":‘数据不完整‘})
#
#第一种校验用户名
#
# name_exist= models.User.objects.filter(username=username)
#
# if name_exist:
#
# return render(request, ‘register.html‘, {"error": ‘用户名已存在‘})
#
#第二种校验用户名
#
try:
#
user = models.User.objects.get(username=username)
#
except models.User.DoesNotExist:
#
#用户名不存在
#
user=None
#
if user:
#
return render(request, ‘register.html‘, {"error": ‘用户名已存在‘})
#
#
if not re.match(r‘^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$‘,email):
#
return render(request, ‘register.html‘, {"error": ‘邮箱格式不正确‘})
#
if allow != "on" :
#
return render(request, ‘register.html‘, {"error": ‘请同意协议‘})
#
#
user = models.User.objects.create_user(username=username,password=password,email=email)
#
#django内置的user中有一个is_active,注册成功默认激活,这里不认他激活
#
user.is_active = 0
#
user.save()
#
return redirect(reverse(‘goods:index‘))
##########注册第二种CBV模式#####
class RegisterView(View):
def get(self,request):
return render(request, register.html)
def post(self,request):
print("=========")
username
= request.POST.get("user_name")
password
= request.POST.get("pwd")
re_password
= request.POST.get("cpwd")
email
= request.POST.get("email")
allow
= request.POST.get("allow")
print(username,password,re_password,email)
if not all([username, password, re_password, email]):
return render(request, register.html, {"errmsg": 数据不完整})
# 第一种校验用户名
# name_exist= models.User.objects.filter(username=username)
# if name_exist:
# return render(request, ‘register.html‘, {"error": ‘用户名已存在‘})
# 第二种校验用户名
try:
user
= User.objects.get(username=username)
except User.DoesNotExist:
# 用户名不存在
user = None
if user:
return render(request, register.html, {"errmsg": 用户名已存在})
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": 请同意协议})
user
= User.objects.create_user(username=username, password=password, email=email)
# django内置的user中有一个is_active,注册成功默认激活,这里不认他激活
user.is_active = 0
user.save()
#发送激活邮件,激活连接地址http://127.0.0.1:8000/user/active/2
#激活连接中要有用户的身份信息,为了防止恶意激活,要对用户信息加密
#加密用户信息,生成激活token
serialize = Serializer(settings.SECRET_KEY,3600)
info
= {"confirm":user.id}
token
= serialize.dumps(info) #byte类型
token = token.decode() #转成utf8
#发送邮件
send_register_active_email.delay(email,username,token)
return redirect(/index)
#激活视图
class ActiveView(View):
def get(self,request,token):
serialize
= Serializer(settings.SECRET_KEY, 3600)
try:
info
= serialize.loads(token) #解密
#获取待激活的用户id
user_id = info[confirm]
user
= User.objects.get(id=user_id)
user.is_active
= 1
user.save()
#激活成功,返回登录页面
return redirect(/login)
except SignatureExpired as e:
return HttpResponse("激活链接已过期")
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:
login(request, user)
#login()使用Django的session框架来将用户的ID保存在session中
#默认跳转到主页,即如果用户直接在login登录则默认跳转主页,如果其他页面转到,则跳转之前页面
next_url = request.GET.get("next",reverse(index))
response
= redirect(next_url)#跳转到首页
remember = request.POST.get("remember")
if remember == "on":
#记住用户名
response.set_COOKIE(username,username,max_age=7*24*3600)
else:
response.delete_COOKIE(
username)
return response
else:
return render(request, login.html, {errmsg: "用户未激活"})
else:
return render(request, login.html, {errmsg: "用户名或密码错误"})
# /user/logout
class LogoutView(View):
‘‘‘退出登录‘‘‘
def get(self, request):
‘‘‘退出登录‘‘‘
# 清除用户的session信息
logout(request)
# 跳转到首页
return redirect(reverse(index))
class IndexView(View):
def get(self, request):
‘‘‘退出登录‘‘‘
# 清除用户的session信息
# 跳转到首页
return render(request,index.html)

url.py

from app01 import views
urlpatterns
= [
url(r
^admin/, admin.site.urls),
url(r
^register$,views.RegisterView.as_view(),name=register),#第一种FBV
url(r^active/(?P.*)$,views.ActiveView.as_view(),name=active),
url(r
^login$,views.LoginView.as_view(),name=login),
url(r
^logout$, views.LogoutView.as_view(), name=logout), # 注销登录
url(r^index$, views.IndexView.as_view(), name=index), # 注销登录
]

 


推荐阅读
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
author-avatar
a7431555
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有