Django 邮件和Message

django邮件组件

  • 导包
    from django.core.mail import send_mail
  • 设置
# 默认配置是EMAIL_BACKEND配置为:django.core.mail.backends.locmem.EmailBackend
# 但是我们用smtp协议需要改成下面的配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend
# SMTP服务器域名
EMAIL_HOST = 'smtp.xxxxx.com' 
# 服务端口,一般SMTP端口是25和425
EMAIL_PORT = 25
# 发送的邮箱账号
EMAIL_HOST_USER = 'Jrri@outlook.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'PassWord'
#收件人看到的发件人 但是好像没有看到效果,也可以设置 EMAIL_FROM=EMAIL_HOST_USER
EMAIL_FROM = 'Jrri<Jrri@outlook.com>'
  • 代码示例1
    使用导入Django模块email,并使用
from django.core.mail import send_mail

subject = 邮件主题
message = '文字内容'
from_email = 发送人(同Setting/EMAIL_FROM)
recipient_list = [收件人1, 收件人2, ...]
html_message = '带有H5标签的消息内容'

send_mail(subject, message, from_email, recipient_list, html_message)
  • 代码示例2
    开线程单独运行

from django.core.mail import send_mail
from Blog import settings
from threading import Thread

t1 = Thread(target=send_mail,args=("通知","插入了%s"%comment,settings.EMAIL_HOST_USER,["123456789@qq.com"]),kwargs={"html_message":"<h2>测试一下</h2>"})
t1.start()


django message组件

Django 的 messages 组件是一个用于向用户显示一次性消息的框架。该组件允许你在某个视图函数中创建消息,然后通过重定向或模板渲染将其传递到下一个视图函数中,以供用户查看。
通俗点解释就是当a页面操作后会自动跳转到b页面,但是a页面同时可能还有操作的状态结果或者其他状态信息需要再跳转到b页面后展示,就可以用message组件,
这个功能如果用ajax可以直接实现,因此当补充知识点

messages 组件支持不同的消息级别,包括:
DEBUG
INFO
SUCCESS
WARNING
ERROR
你可以根据实际需求选择不同的消息级别。例如,当用户成功提交表单时,你可以使用 SUCCESS 级别的消息来向用户显示成功信息。而当用户输入的数据不合法时,你可以使用 ERROR 级别的消息来提示用户。

使用 messages 组件非常简单,只需要在视图函数中调用 messages.add() 方法即可。

from django.contrib import messages
from django.shortcuts import render, redirect
from myapp.forms import MyForm

def my_view(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, '表单提交成功!')
            return redirect('myapp:index')
        else:
            messages.error(request, '表单输入有误,请重新输入!')
    else:
        form = MyForm()

    return render(request, 'my_template.html', {'form': form})

在setting.py文件中的几处配置

1. 设置MESSAGE_STORAGE变量
# MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
# MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
message无法存储数据,不同的模式表示是将数据存储在cookie或者session中 ,FallbackSotrage表示 cookie和session都保存

2. 添加app
INSTALLED_APPS = [
    # 'django.contrib.admin',
      ...
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "web.apps.WebConfig"
]

3.添加中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
      ...
    'django.contrib.messages.middleware.MessageMiddleware',
    
]


4.添加模版信息
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                 ..
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

在setting.py文件中的几处配置

设置值


from django.contrib import messages
messages.add_message(reqeust, messages.SUCCESS, "删除成功1")
messages.add_message(reqeust, messages.ERROR, "操作失败")

这里的删除成功1和操作失败 是会被写入到一个列表中去

读取值

from django.contrib.messages.api import get_messages
messages = get_messages(request)
for msg in messages:
    print(msg)
<ul>
    {% for message in messages %}
	    <li>{{ message.tags }} {{ message }}</li>
    {% endfor %}
</ul>

读取message消息 from django.contrib.messages.api import get_messages get_messages(reuqest) 读取消息,

返回的是一个列表 [message_obj] 里面的元素是message对象,可以用属性mesaage读取

对get_messages返回的对象进行遍历可以实现读取后,清除消息的作用,第二次读取就无法获取里面的消息

同时会自动向前端页面传一个messages的参数,这一步是框架在TEMPLATES配置中自动做的.因此可以循环遍历获取

message组件源码分析

  • 【设置】中间件process_request加载

  • 【设置】在视图函数中往message中写入值(内存)

  • 【设置】中间件process_response,将内存中新增的数据写入到数据源

  • 【新页面】中间件process_request加载

  • 【新页面】在视图函数或模板中读取message中的信息(老的数据源加载的+新增的)

  • 【设置】中间件process_response

    used = True,则只保存新增部分。
    added_new = True,老的数据源加载的+新增的都重新保存到数据源。
    
posted @ 2021-11-20 19:39  零哭谷  阅读(72)  评论(0编辑  收藏  举报