热门标签 | 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), # 注销登录
]

 


推荐阅读
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • 高效批量文件重命名软件
    开发了一款基于Python的高效批量文件重命名软件,并集成了wxWidgets图形用户界面,使用cxfreeze将其打包为独立的可执行文件(exe)。该工具适用于需要频繁处理大量文件的用户,能够显著提高文件管理效率。详细使用说明包含在软件压缩包内。开发环境为Python 2.7和wxWidgets 3.0,运行环境要求兼容Windows系统。 ... [详细]
  • 前端技术实现调用摄像头进行拍照功能
    在公司项目中,为了实现调用摄像头进行拍照的功能,我们深入研究了HTML5的相关技术。尽管Java在许多方面表现出色,但在这一场景下,HTML5的灵活性和易用性更胜一筹。本文将分享具体的代码设计和实现细节,帮助开发者快速掌握这一功能。 ... [详细]
  • 如何在IDEA中安装和配置反编译插件以提高代码审查效率
    在 IntelliJ IDEA 中提升代码审查效率的一种方法是安装和配置反编译插件。首先,进入 IDEA 的设置界面,然后导航到插件管理部分。接下来,搜索 "ideaJad" 插件并进行安装。安装完成后,重启 IDEA 以确保插件生效。这将帮助你在审查二进制文件时更加高效地查看源代码。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • 尽管许多人认为跑步是一项简单的运动,但实际上它涉及诸多专业知识。不正确的跑步方式不仅会降低锻炼效果,还可能引发伤害。例如,穿着不合脚或过于陈旧的跑鞋,会导致足部支撑不足,增加受伤风险。此外,跑步姿势不当、热身不足、过度训练等问题也同样值得关注。本文将详细介绍七大常见跑步误区,并提供专业的改进建议,帮助跑者避免这些问题,提高运动效率和安全性。 ... [详细]
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • 本文深入探讨了原型模式在软件设计中的应用与实现。原型模式通过使用已有的实例作为原型来创建新对象,而不是直接通过类实例化。这种方式不仅简化了对象的创建过程,还提高了系统的灵活性和效率。具体来说,原型模式涉及一个支持克隆功能的接口或基类,子类通过实现该接口来提供具体的克隆方法,从而实现对象的快速复制。此外,文章还详细分析了原型模式的优缺点及其在实际项目中的应用场景,为开发者提供了实用的指导和建议。 ... [详细]
  • 在执行 Vim/VM 命令时遇到错误提示:检测到名为
    在使用 Docker 时,通过 Vim 编辑 Dockerfile 文件时遇到了错误提示:“检测到名为 .dockerfile.swp 的交换文件”。这一问题通常是因为上次编辑该文件时意外中断,导致系统生成了临时的交换文件。为了解决这个问题,可以手动删除该交换文件或使用 Vim 的恢复功能来恢复未保存的更改。 ... [详细]
  • Vuex 实战进阶:构建高效笔记本应用(第二篇)
    在上一篇文章中,我们初步探讨了 Vuex 在该项目中的应用。本文将深入解析整个项目的架构设计。首先回顾 `main.js` 的内容,然后重点分析 `App.vue` 文件,其中引入了 `Toolbar.vue` 和 `NodeList.vue` 组件,详细说明它们在应用中的作用和交互方式。通过这些组件的协同工作,我们将展示如何构建一个高效且响应迅速的笔记本应用。 ... [详细]
  • 新年伊始,正是学习的最佳时机。本文全面解析了CK1957-Zookeeper的核心概念与实践技巧,旨在帮助初学者快速掌握这一深度学习工具。通过详细的理论讲解和实际操作示例,读者可以更好地理解Zookeeper的工作原理及其在分布式系统中的应用。无论是新手还是有一定基础的学习者,都能从中受益匪浅。 ... [详细]
  • 探究Oracle数据库字符集编码的详细方法与实践
    本文深入探讨了Oracle数据库字符集编码的详细方法与实践。首先,通过执行 `SELECT USERENV('language') FROM DUAL;` 查询服务端字符集编码。其次,通过在注册表中搜索 `NLS_LANG` 参数来查看客户端字符集编码。此外,文章还介绍了如何在不同场景下正确配置和转换字符集,以确保数据的一致性和完整性。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 斐波那契数在组合数学中的应用与探索
    斐波那契数列作为数学领域中一个广为人知的数列,不仅拥有丰富的数学性质,还与自然界的诸多现象紧密相连。本文将深入探讨这一数列背后的奥秘,揭示其在组合数学中的广泛应用,并通过具体问题的引入,展示斐波那契数列在解决复杂组合问题时的独特优势。 ... [详细]
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社区 版权所有