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, ...
随机推荐
- VS2015 scanf 函数报错 error C4996: 'scanf'
错误提示:error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. ...
- HDU 5552 Bus Routes(NTT+分治)
题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...
- Vue常见指令
文本相关指令 <div id="app"> <!-- 插值表达式 --> <p>{{ msg }}</p> <!-- eg:原 ...
- Codeforces Round #495 (Div. 2) D. Sonya and Matrix
http://codeforces.com/contest/1004/problem/D 题意: 在n×m的方格中,选定一个点(x,y)作为中心点,该点的值为0,其余点的值为点到中心点的曼哈顿距离. ...
- SSH框架整合,css、js会被过滤器过滤掉
如果是默认状态 <!--struts2过滤器--> <filter> <filter-name>struts2</filter-name> <fi ...
- 【GO】【sublime】
1.首先下载GO的安装包:https://golang.org/doc/install#testing 找到上面一个Download超大按钮,找不到的可以不用再看了. 下载完成,安装. 安装成功后,启 ...
- 扩展的GM命令
命令 说明 例子 .rl all 重载核心所有自定义数据表 .rl item 重载item_template .backup a 备份Auth数据库 .backup c 备份Charact ...
- flex外包团队—北京动点软件:推荐一本不错的Flex书籍
内容介绍:Ready to put your ActionScript 3 skills to work on mobile apps? This hands-on book walks you th ...
- Behavior Question - Most challenging project.
介绍项目,challenging的地方 The most challenging project I have ever done was an online collaborative coding ...
- [Hibernate] inner Join和 left Join
@Test public void test11(){ Session ss=HibernateUtil.getSession(); //根据员工名称(SCOTT)找到和他所在的部门的其他员工的信息 ...