django中向用户发送邮件信息
发送邮件来让用户激活,因此,邮件中需要包含用户信息。但用户信息需要加密才可以。因此加密采用的是itsdangerous中的TimedJSONWebSignatureSerializer。
参考链接:https://juejin.im/entry/56b30250df0eea0054375e1d
用法和JSON WEB 签名中的用法一样。
加密:
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 创建对象, 第一个参数加密密钥,可以随便写,但解密也需要相同的,
# 过期事件,秒为单位
serializer = Serializer(settings.SECRET_KEY, 3600)
# 要加密的数据
info = {'confirm':zengsf}
# 进行加密,token为加密结果,bytes数据
token = serializer.dumps(info)
# 转换为utf8格式
token = token.decode()
解密:
# 创建一个对象
serializer = Serializer(settings.SECRET_KEY, 3600)
# 将str装换为byte
token.encode()
# 参数是加密之后的结果,返回是解密之后的结果
info = serializer.loads(token)
# 获取值
result = info['confirm']
如果过期的话,会有一个SignatureExpired的签名过期异常。
我们利用邮箱大部分都是163,qq, 126这些邮箱,这些都是免费的,都是smtp模式。
到django中settings.py中进行配置:
# 发送邮箱配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smtp服务地址
EMAIL_HOST = 'smtp.163.com'
# 端口号
EMAIL_PORT = 25
# 发送邮件的邮箱
EMAIL_HOST_USER = 'zengsf***@163.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'zengsf***'
# 收件人看到的发件人
EMAIL_FROM = '<zengsf***@163.com>'
然后回到视图中,具体用法:https://yiyibooks.cn/xx/django_182/topics/email.html
from django.core.mail import send_mail
msg='<a href="http://www.127.0.0.1:8000/subject/pythonzly/index.shtml" target="_blank">点击激活</a>'
send_mail('注册激活','',settings.EMAIL_FROM,
['zengsf***@163.com'],
html_message=msg)
这样就实现了在django中发送邮件消息。但有一个问题就是,send_mail是一个阻塞函数,因此给客户带来长时间等待,体验感不好。然后可以使用celery来解决这个问题。主要就是分三种,发送者,中间人,处理者。
发送者:就是要处理的事件。
中间人:SQLAlchemy、Django ORM、Memcached、 Redis、RPC (RabbitMQ/AMQP)都可以当中间人。
处理者:就是监听中间人,并处理事件。
这里使用redis当中间人。
发送者:-----------------------------------------------
创建一个tasks.py
from celery import Celery
from django.conf import settings
from django.core.mail import send_mail # 创建一个Celery类的实例对象
app = Celery('demo',broker='redis://:127.0.0.1:6379/1') # 创建任务函数
@app.task
def my_task():
msg='<a href="http://www.127.0.0.1:8000/subject/pythonzly/index.shtml" target="_blank">点击激活</a>'
send_mail('注册激活','',settings.EMAIL_FROM,['zengsf***@163.com'],html_message=msg)
接着来到发邮件的views中。
from celery_tasks.tasks import my_task # 发送任务, 就会把任务发送到redis中的任务队列中
my_task.delay()
到这里,发送者和中间人就ok了。
处理者:---------------------------------
如果发送者,中间人,处理者在不同的电脑中,但一定要在同一网段中,要确定互相通信。
启动处理者的前提是你的中间人也要开启。由于环境不再一起,因此,处理者那边也要有一份和发送者这边一样的代码。
启动处理者:celery -A celery_tasks.tasks worker -l info
如果这样直接去发邮件话,还会报错,serder = settings.EMAIL_FROM这个错误,这是因为,tasks.py中需要用到django中的配置文件,但由于这里没有启动django项目,因此就报错了。解决方法就是在启动处理者的时候,初始化django里面的配置文件
然后在tasks.py中添加一些初始化功能:
# 在任务处理者一端加这几句
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
django.setup()
这样就可以了。
django中向用户发送邮件信息的更多相关文章
- .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息
在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...
- django中添加用户
在django中添加用户,直接在auth_user表中添加会有问题,因为这里密码是加密的,可以通过manage.py shell加入 创建User: 1 >>> from djang ...
- 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口
在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...
- Django 中的用户认证
Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任 ...
- 微信小程序之登录连接django,以及用户的信息授权认证
小结: 1 如何自定义组件 - 组件和页面一样,也是由四个文件组成,所以我们自定义组件的时候,模拟pages文件夹,把所有的所有的组件都放在一个文件夹中,每个组件又由一个文件夹包裹,方便管理,在对应目 ...
- Django 中自定义用户模型及集成认证授权功能总结
1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...
- SAP中关于用户IP信息的获取(转载)
SAP中如何获取登录用户的IP? 或如何查看哪些IP登录到SAP中: 在Table: USR41中查看,具体字段的说明如下: MANDT --- ClientBNAME --- 登录的 ...
- Oracle 中记录用户登录信息
我们可以使用 Oracle Audit 函数来记录用户登录信息,但是如果开放了 Audit 函数将会使 Oracle 性能下降,甚至导致 Oracle 崩溃.那我们如何才能记录用户登录信息呢?其实我们 ...
- ORACLE 存储过程中保存用户自定义异常信息的一种方式
1.创建错误日志表: create table REP_LOGS ( log_s_no NUMBER not null, log_date DATE default sysdate not null, ...
随机推荐
- EJB到底是什么?
EJB到底是什么? 1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业 ...
- AndroBench手机性能测试【转】
本文转载自:https://www.cnblogs.com/jiangzhishan/archive/2018/07/16/9316279.html AndroBench是一个基准测试应用程序,可以衡 ...
- Learning-Python【29】:网络编程之粘包
粘包问题 上一篇博客遗留了一个问题,在接收的最大字节数设置为 1024 时,当接收的结果大于1024,再执行下一条命令时还是会返回上一条命令未执行完成的结果.这就是粘包问题. 因为TCP协议又叫流式协 ...
- QuerySet API
模型objects:这个对象是 django.db.model.manager.Manger 的对象,这个类是一个空壳类,它上面的所有方法都是从 QuerySet 这个类中拷贝过来的. >> ...
- php 按照中文字母名字排序,并把相应的头像显示出来
//排序public function getFirstChar($s){ $s0 = mb_substr($s,0,3); //获取名字的姓 $s = iconv('UTF-8','gb2312', ...
- BFS GPLT L2-016 愿天下有情人都是失散多年的兄妹
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 分析:一开始以为是并查集..... ...
- vue实现tab切换功能
最近用vue做一个页面的tab功能,经过一查找资料,没用路由,也没用动态组件,完美实现了tab切换功能,效果如下 下面是代码实现,这是模板 <article id="example&q ...
- 1)selenium+ java集成,待深度项目流程应用
selenium 1,selenium ide mac 安装 打开firefox浏览器,进入下面网址https://addons.mozilla.org/en-US/firefox/addon/sel ...
- javax.net.ssl.SSLException: Certificate doesn't match any of the subject alternative names
问题:在使用 org.apache.http.*下的 CloseableHttpClient 发送https请求时报了以上错误 解决方案一:使用java.net.HttpURLConnection i ...
- VMware 虚拟机centos下链接网络配置
1.点击Network Adapter 设置如下图所示,首先我们在虚拟机中将网络配置设置成NAT, 2.计算机右键->管理->服务和应用程序->服务,启动如下两个服务 3.在etc/ ...