Django通过celery 异步发送邮件 : django开发之天天生鲜项目知识总结【5】

天天生鲜(Django4.0版本) + 开发遇到的问题及解决 天天生鲜(Django4.0版本) 阅读详情

这里初次学习celery,只简单讲解一下如何使用celery 异步发送邮件,在以后的总结中还会,多次提到celery,因为后面很多任务都需要用到celery执行任务,后面再专门针对celery做具体的总结:

点击这里,可以参看网上找到的文章,人家的笔记超详细

  • 这里展示一张我看视频老师的图片示例,通过图片先大致了解一下(理解很重要~~~~):
    在这里插入图片描述
  • 根据图示,我们知道,celery,是要有三部分实现的:

首先是 任务的‘发出者’, 然后接受任务的‘任务队列’作为中间人(broker), 其次是监听任务的‘处理者’(worker); 下面就具体说明到底谁来充当这几个,来完成具体任务。

  • 下面是从官网上面截取的图片,。大致了解一下什么叫做任务队列
    在这里插入图片描述
  • celery本身并没有提供 任务队列的功能,我们需要借用数据库:
    在这里插入图片描述
    这两种皆可以,我使用的是 redis数据库
  • 那么我们就用 reids数据库,作为我们的中间人,也就是broker。
  • 我们的项目代码就相当于是任务的发出者,当我们需要发送邮件时,就调用函数去往任务队列中,添加发送邮件的任务。
  • 那么处理就是我们的celery了

下面来说说每一步的具体实现过程

(1)任务的发出者

  • 首先先来在虚拟环境中下载celery
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple celery
  • 下一步,就像之前所说的,我们以后会经常使用celery来执行任务,所以,通常情况下,我们会在项目下建立一个目录,然后在里面新建文件,用来单独存放我们的任务。
    在这里插入图片描述
  • 接下来:开始完成建立的这个任务文件:直接上具体实现的代码~
from django.conf import settings
from django.core.mail import send_mail   # 导入这两个,是为了,完成发送邮件的任务,一个是需要的函数,一个是所需要从settings里面获取相关的参数
# 使用selery
from celery import Celery  

# 创建一个celery的实例对象
app = Celery('celery_tasks.tasks', broker='redis://192.168.113.132:6379/8')  # broker中间人,后面跟上数据库(redis)://ip地址端口号/使用地几个数据库  ,  ps aux | grep redis 查看开启的redis服务器, 第一个参数是任务文件的地址
# 定义任务函数(这里完成发邮件)

@app.task    # 加上这个装饰,才可以,后面讲加这个装饰的作用。
def send_register_active_email(to_eamil, username, token):
    """发送激活邮件"""

    # 组织邮件信息, 这部分上一节也讲过了,不懂可以回头看哦~
    subject = '天天生鲜欢迎信息'
    # 邮件的正文,当发出的内容中含有html标签的时候,不能在使用 message 这个参数传递,因为不会解析 标签,要使用 html_message,我上一节讲到了这个知识点
    # message = '<h1>%s, 欢迎你成为天天生鲜注册会员</h1>请点击下方链接激活你的账户<br/><a href="http://127.0.0.1/user/active/%s">http://127.0.0.1/user/active/%s</a>'%(username, token, token)
    message = ''  # 没有内容的时候可以指定为空
    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)

    # 发件人
    sender = settings.EMAIL_FROM
    # 收件人,是一个列表,可以发送给多人
    receiver = [to_email]

    send_mail(subject, message, sender, receiver, html_message=html_message)
  • 下面就开始设置我们views.py里面的视图,让它通过celery去发送任务
  • 导入我们的任务函数
from celery_tasks.tasks import send_register_active_email

....此处省略代码,文章结尾给出所有代码

# 使用selery,帮助发送邮件
        send_register_active_email.delay(email, username, token)   # 通过app.task 装饰,就具有这个方法,使用这个函数,把任务放入任务队列
  • 给出这个views.py里面发送 邮件类 全部代码:
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse  # 使用反向解析
from user.models import User
from django.views.generic import View
from django.conf import settings
import re

from celery_tasks.tasks import send_register_active_email
# 导入用来实现加密的类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired  # 异常捕获
from django.http import HttpResponse

# 导入发邮件函数
from django.core.mail import send_mail

# Create your views here.


class RegisterView(View):
    """注册类"""

    def get(self, request):
        """显示注册页面"""
        return render(request, 'register.html')

    def post(self, request):
        """进行注册处理"""
        # 进行注册请求
        # 1. 接受数据(参数)
        username = request.POST.get('user_name')
        password = request.POST.get('pwd')
        email = request.POST.get('email')
        allow = request.POST.get('allow')  # 判断用户是否同意使用协议

        # 2.进行数据的校验(在这里验证是否传递了所需要的三个参数,校验完整性)
        if not all([username, password, email]):
            """all()方法,传递的参数是可迭代的东西,对里面的每一个元素进行判断,如果都为真的时候all()函数才会返回真"""
            # 如果不正确,就在返回登陆页面,带上错误信息。
            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': '请同意协议'})

        # 校验用户名是否重复
        try:
            user = User.objects.get(username=username)  #
        except User.DoesNotExist:
            # 抛出异常说明用户名不存在,
            user = None

        if user:
            # 用户名已存在
            return render(request, 'register.html', {'errmsg': '用户名已存在'})

        # 因为我们是继承使用的django 内置的认证系统,所以我们不需要向上面那样去做
        # 调用 create_user() 方法
        user = User.objects.create_user(username, email, password)
        # df_user 里面有一个字段 is_active,默认为1,表示激活,我们需要修改它为0
        user.is_active = 0
        user.save()

        # 发送激活邮件,包含激活链接:http://127.0.0.1:8000/user/active/1(1就是注册的用户id)
        # 激活链接中需要包含用户的身份信息:并且要将身份信息加密(防止某些人看穿规律,肆意伪造链接访问)

        # 加密用户的身份信息,生成激活的token
        serializer = Serializer(settings.SECRET_KEY, 3600)
        info = {'confirm': user.id}
        token = serializer.dumps(info)   # 显示的是 b'' 类型数据, 也就是 bytes类型数据,我们把它转换为字符串
        token = token.decode()   # 默认按照utf-8进行解码,变成字符串
        # 使用selery,帮助发送邮件
        send_register_active_email.delay(email, username, token)   # 通过app.task 装饰,就具有这个方法,使用这个函数,把任务放入任务队列

        # 4.返回应答,跳转到首页
        return redirect(reverse('goods:index')) 

额~~上面完成了 发送者和中间人(中间人就是配置的redis)了。。那么下面就说处理者吧。

  • 需要注意点是:

  • (1)任务的发出者, 中间人, 任务的处理者,可以在同一台电脑上面启动, 也可以不在同一台电脑上。

  • (2)处理者也需要任务的代码!我们需要将项目代码复制一份。

  • 我们复制一份程序的代码到桌面(我用的是ubantu)
    在这里插入图片描述

  • 然后打开终端进入到目录里面:这里要注意:

  • 启动worker ,也是需要我们的环境中安装了celery.所以进入虚拟环境(我再次虚拟环境中安装了celery,或者直接进入项目使用的虚拟环境都行,主要是必须有celery)
    在这里插入图片描述

  • 下面就可以执行命令,启动我们的处理者(worker),监听处理任务了。

celery -A celery_tasks.tasks worker -l info
# 参数解释 
-A 后面,我们要指定,创建的任务app,在哪个文件里面
-l info 收到任务时会打印出来一些相应的信息,我们可以设置信息的级别,-l info 表示把提示信息显示出来。
  • 下面就是启动成功之后显示的一些信息:
  • 解释一下
1.app: 对应的内容就是我们创建celery类对象,写的第一部分地址参数,我这里再把它写一遍,以供参考:
app = Celery('celery_tasks.tasks', broker='redis://192.168.113.132:6379/8')  # broker中间人,后面跟上数据库(redis)://ip地址端口号/使用地几个数据库  ,  ps aux | grep redis 查看开启的redis服务器

2.transport: 对应的就是第二个参数,对应着我们的中间人

3. concurrency:  就是代表你worker进程的数量

4 [tasks]:   在启动worker时,它知道你这里面有这个 发送邮件的任务函数

5.注意下面四条带有日志时间的提示信息,很重要,他说明你成功连如监听你的中间人(redis),若没有出现就会报错:

若没有出现就会报错:
在这里插入图片描述
解决办法就是,打开你的redis服务,就好,并且连接的地址和端口设置正确

  • 我的启动 和查看启动(我之前的文章,将结果配置,启动服务器)在这里插入图片描述
  • 之后,就可以开启我们项目服务了
python manage.py runserver
  • 之后进行访问登录注册网址
    在这里插入图片描述
  • 成功进去之后就会之后,看到终端中的反映:
    在这里插入图片描述
    先不管红色字体,下面会讲,看到黄色框中的东西,就说明成功监控到任务并且执行了!!
    在这里我要特别提一下,当你的代码项目代码有问题时,这里会报错可以找到对应的问题解决,但有时候并不是你的原因!!而是对应celery版本不行,它自身的原因!!因为我使用的是 1.8.2版本的django,比较古老了,最开始下载最新的4.3版本celery表示不适配,我的django版本过低~~,然后我换了一个3.1版本的,一运行就报错。。。。找了好久,都以为是我的代码的问题,结果回头看老师的视频,老师使用的是4.1.0版本的celery!!所以,问题出在还是处在版本上面,下面就更奇怪了。。。我换了4.1.0版本的还是报错。。。但是老师也是1.8.2版本的django就可以运行。。所以我很纳闷呀。。。想了好久,还是感觉是版本的问题,坚信自己的代码没问题!!(哈哈),结果在多次尝试之后,下载了celery4.2.0版本!!!,成功运行!!!得出和老师一样的结果! 所以就是要说,遇到问题一定要思路清晰,找对角度,报错不一定都是你代码的问题,注意根据自己的django下载对应的版本~~~ 就说这些吧~~
  • 下面我们再来仔细分析红色字体的报错:注意力集中在这一句:
    在这里插入图片描述
    原因就在于,我们启动worker项目的时候,并没有启动django项目(python manage.py runserver)!!,我们的任务本身需要使用一些django本身的配置项,这些配置项它是依赖于你需要先对Django的环境变量做一些初始化,没有初始化,用不了,就会报错误了!
  • 下面就来解决这个问题:我们需要更改任务文件里面的代码,让它能够进行初始化。
    在这里插入图片描述
  • 下载我们要手动去实现它:在tasks.py文件中(上面写任务函数的文件中),加上
# 在任务处理者一端加这个
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
django.setup()  # 初始化django

这样就完成了!!

  • 接下来重新启动 worker,会有警告:
    在这里插入图片描述
    意思是我们的settings.DEBUG设置为True,他可能造成内存的泄露这句不是错误,不用管他~因为我们现在就是出于来发模式,要看到运行报错,正式上架产品之后,就会关掉调试模式。

  • 下面就到了再次注册用户测试了!!
    在这里插入图片描述
    成功登陆!!并发送邮件,要注意,修改代码之后,必须重新启动worker。

好了,到此就差不多结束了!谢谢~

Django项目之Web端电商网站的实战开发(二) 说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.youkuaiyun.com/qq_41782425/article/details/88790662 目录 一丶用户注册 二丶用户登录 一丶用户注册 1.显示用户注册页面 step1 在static目录下将register.html文件拷贝到templates模板目录下 ... 阅读详情

相关推荐

Python天天生鲜项目代码及部署文件

压缩包里包含使用Python语言下的django框架编写的天天生鲜项目,为了方便使用,里面有写好的部署文档。可以根据部署文件的内容进行项目搭建。

Python开发运维:Django 4.2.7 使用Celery 5.3.5 完成异步和定时任务

(10)tasks.py文件定义异步或定时任务。(4)urls.py引用视图views。(11)编写配置文件config.py。(22)浏览器再次刷新或回车,进行观察。(15)浏览器刷新或回车,进行观察。(14)view视图添加异步代码。(17) mycelery根目录。(26)查看Redis可视化界面。(7)查看运行结果,点击链接。(20)注释异步任务代码。(21)添加定时任务代码。(1)安装Django。(13)tasks文件。(24)查看RUN结果。(19)查看异步消息。(23)查看定时消息。

cronaldo91的博客 1917

天天生鲜项目源码

天天生鲜项目完整源码,用django框架进行编写的,适合新手用来研究

异步框架Celery在Django中的运用

异步请求:异步进行,当IO操作阻塞时放到执行单元中完成放到数据库中而不影响其他单元的执行,当主进程需要阻塞的进程结果时会向是数据库中取出该数据(即将耗时操作放到异步队列中不影响主进程的执行),继续向下进行。(注意celery5.0之前的命令是不一样的:celery worker -A celery_task -l info)celery多任务结构下异步执行:注意celery_tasks的celery名字是固定,不然会报错。定义:简单灵活、处理大量消息的分布式系统,专注于实时处理异步队列,支持任务调度。

种一棵树,最好的结果是十年前,其次是现在! 1896

Django使用Mandrill发送邮件记录

Mandrill可以免费发送邮件,每月1万2000封的邮件数量足够普通使用。使用Django配合Mandrill发送邮件,配置相关DNS记录可以使邮件发送到收件箱而不会进入垃圾箱。可以访问forum.beavermagic.com灌水呀~

Django集成celery发送异步邮件实例

今天小编就为大家分享一篇Django集成celery发送异步邮件实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

天天生鲜项目经验

一、项目架构 前端: 用户相关 商品相关 购物车相关 订单相关 后台管理 后端: 用户模块 商品模块 购物车模块 订单模块 后台管理模块 技术: mysql session 缓存服务器redis 异步任务处理celery 分布式文件存储系统fastdfs 二、用户认证模型 # django认证系统使用的用户模型 AUTH_USER_MODEL = "users.User" 1.类视图...

qq_20567419的博客 3168

学习STM32的流体水位传感器

引言: 流体水位传感器是一种常用于测量液体水位的设备,广泛应用于水位监测、液位控制和流量计量等领域。STM32是一款功能强大的单片机,具有丰富的外设和灵活的编程能力,非常适合用于流体水位传感器的开发。本文将介绍如何使用STM32开发板与流体水位传感器进行连接和通信,并通过编写代码实现水位的测量和显示。五、总结: 通过以上的代码示例,我们可以实现使用STM32开发板与流体水位传感器进行连接和通信的功能。三、编写代码: 以下是使用STM32CubeIDE编写的示例代码,实现了读取流体水位传感器的功能。

xiaoalla的博客 739

django3使用celery5

一、前言 我百度了两天,尝试了N种方法,才搞定这东西的。 二、celery的配置 下载celery这个就不说了。 在settings.py同级目录创建celeryCenter.py, # django项目名/django项目名/celeryCenter.py from __future__ import absolute_import, unicode_literals import os from celery import Celery # 设置环境变量 os.environ.setdefault

放风喽的博客 1759

基于WEB的报价管理系统的设计与实现

该系统采用B/S模式,后台运用SpringMVC和MyBatis搭建,利用MySQL数据库,来组织存储和管理数据,使用tomcat服务器向外提供服务。使用该系统对外有利于提高企业的综合竞争力,对内有利于提高成本管理和控制的水平,简化了报价流程、提高了工作效率、精简了报价机构,降低了成本。研究和掌握必要的信息采集和数据查询技术,是各个企业,事业单位信息化的一个重要标志。当前大多数企业采取的报价方式仍然是用EXCEL表格和人工的方式,这不仅不利于大量数据的总结,更不利于对销售利润的控制。

m0_60918862的博客 999

一文入门Qwen-Agent【附实战代码】

Qwen-Agent 是一个开源框架,用于开发基于 Qwen 模型的 AI 智能体应用,一文带你入门使用

m0_55303420的博客 1873

django-celery-redis异步发邮件

Django-Celery-Redis异步发邮件 python == 3.7.6 django == 2.1.8 celery == 4.4.7 redis == 3.5.3 eventlet == 0.26.1 什么是celery Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题,使用非常简单。celery适用异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。 celery的特点是: 简单,

qq_15832329的博客 451

损失函数大汇总(三十八)(AUCPR Loss附公式推导与代码)

本文系统介绍了AUCPR Loss的原理与应用。针对不平衡分类任务中AUC指标不够敏感的问题,提出通过优化PR曲线面积(AUCPR)来提升模型性能。文章详细推导了AUCPR的可微近似实现:首先用sigmoid函数软化阈值判断,构造可微的TP/FP/FN计数;然后基于软Precision和Recall计算近似PR曲线面积;最后通过数值积分得到可优化的损失函数。特别讨论了温度参数τ对训练稳定性的影响,并比较了AUCPR与AUC、AP等指标的异同。该方法适用于医学筛查、欺诈检测等极端不平衡场景,能更准确反映模型对

悦学共鸣,温柔以待,汇聚光芒,共同成长 441

Django中web开发使用模块celery的异步发送邮件

celery的基础用法可以参考之前转载的文章: https://blog.youkuaiyun.com/ATOOHOO/article/details/88976521 1、编写异步任务队列文件: celery 按照固定的套路是可以编写出一下的程序的 from django.core.mail import send_mail from django.conf import settings from cel...

凌云俯瞰 765

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

精准农业是现代农业发展的核心方向,其中杂草的实时、准确检测是减少除草剂滥用、实现变量喷施的关键技术瓶颈。本文详细阐述了一套完整的、基于YOLO(You Only Look Once)系列目标检测算法的田间杂草检测系统。系统覆盖从模型对比选型(YOLOv5, YOLOv6, YOLOv7, YOLOv8)、自定义数据集构建与标注、模型训练与优化,到最终构建基于PyQt5/FastAPI/Gradio的可视化UI界面的全流程。本文提供了完整的Python代码、项目结构、训练技巧及公开数据集指引,旨在为农

YOLO 357

基于大模型与知识图谱的对话引导意图澄清系统技术解析

本文提出了一种基于知识图谱与大语言模型的意图澄清系统,旨在解决传统RAG模型在跨文档推理和主动澄清方面的不足。系统通过知识图谱驱动的多跳推理机制和链式思维引导的对话流程,实现了动态信息补全和意图澄清。核心创新包括:1)知识图谱构建与节点选择算法;2)标签探索策略与原子事实提取方法;3)主动澄清引擎的工作流程。实验表明,该系统能有效提升复杂查询的准确率,在医疗、金融等领域实现精准交互。关键代码展示了节点选择、标签匹配和事实提取等核心组件的实现细节。

409

天天生鲜Django项目

天天生鲜一、Web项目开发流程二、需求分析2.1 用户模板2.2 商品相关2.3 购物车相关2.4 订单提交三、项目架构3.1 页面图3.2 功能图3.3 部署图3.4 项目架构3.5 数据库设计四、初始化项目配置富文本在Admin中使用五、项目开始项目框架搭建六、用户模块开发6.1 用户注册6.2 用户登录Redis存储Session记住用户名父模板页抽象6.3 用户中心三页面6.4 登录后页面跳转6.5 登录后欢迎信息6.6 用户退出登录6.7 用户中心_地址页6.8 模型管理器类方法封装6.8 用户中

果子哥丶的博客 7913

rk3568 适配以太网(mac 2 mac)

MDIO(Management Data Input/Output)是一种管理数据输入/输出协议,用于在以太网交换机和PHY(物理层收发器)之间进行通信。在Android中,MDIO总线用于控制网络接口的PHY芯片,例如通过MDIO总线访问PHY芯片的寄存器。这些寄存器包含了一些关于网络连接状态、链路速度和其他计算机网络相关信息的数据。MDIO总线通常由网络接口控制器(NIC)使用,以便在OS中管理PHY芯片。在Android设备上,MDIO总线通常由内核驱动程序管理,并且可以通过 /sys/bus/mdi

weixin_35723192的博客 2453

天天生鲜Django项目①

1.需求分析 1.1 用户模块 注册页 注册时校验用户名是否已被注册。 完成用户信息的注册 给用户的注册邮箱发送邮件,用户点击邮件中的激活链接完成用户账户的激活。 登陆页 1 实现用户的登录功能 用户中心 用户中心信息页,显示登录用户的信息,包括用户名、电话和地址,同时页面下方显示出用户最近浏览的商品信息。 用户中心地址页:显示登陆用户的默认收件地址,页面下方的表单可...

王大阳的博客 3247

车载网络测试实操源码_使用CAPL解析VBF文件

VBF(Versatile Binary Format)文件是一种二进制文件格式,被沃尔沃、福特、马自达、吉利等汽车制造商广泛采用。这种格式无法使用我们常规的烧录器进行刷写,通常需要进行解析转化。如果各位需要自己编写软件或脚本来刷写VBF文件,或者需要对刷写功能进行测试时,那么本篇文章就会对你非常有用。今天我们就来讲一下如何使用CAPL脚本对VBF文件进行数据解析。VBF文件包含三部分:VBF版本段、文件头段、数据段。前面的版本段和文件头段是ASCII码,包含版本、地址、校验码等信息

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 2986

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

django项目中使用celery实现异步发送邮件

1. celery概览图: 2. 安装celery pip install celery 3. django项目目录下新建一个Python包:celery_tasks,在该包下新建一个python文件:tasks.py 4. 在tasks.py文件中代码如下 from celery import Celery from django.conf import settings from django.core.mail import send_mail # 创建一个Celery类的实例对

weixin_42289273的博客 671

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

celery异步发送邮件

利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决 首先我们来看一下邮件发送的过程: Django网站先发送到smtp服务器 smtp服务器再把邮件发送到目的邮箱 这里有两个不确定时间: Django网站----->smtp服务器 smtp服务器----->目的邮箱 ...

weixin_33739523的博客 168

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Django中的使用celery异步处理的整个流程

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

Shaun_X 1409

Celery异步发送邮件

一、settings.py 1 # 发送邮件配置 2 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 3 # smpt服务地址 4 EMAIL_HOST = 'smtp.163.com' 5 EMAIL_PORT = 25 6 # 发送邮件的邮箱 7 EMAIL_HOST_USER = 's...

weixin_30437337的博客 151

【Django 天天生鲜项目02】注册、登录、用户中心 (itsdangerous模块加密、celery异步、 Django 的验证系统、redis作为缓存等)

关键:类视图的使用、用itsdangerous模块加密身份信息、使用celery异步发送邮件、使用 Django 的验证系统、redis作为缓存和session存储后端、login_required装饰器、LoginRequiredMixin类的使用、redis存储浏览记录的流程...

在下能猫 的博客 1497
上一篇: 如何通过django向用户发送邮件: django开发之天天生鲜项目知识总结【4】
下一篇: 制作登录时的验证码 : django开发之天天生鲜项目知识总结【6】
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值