一:Django发送邮件

在setting中配置

# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com' # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = '306334678@qq.com' # 帐号
EMAIL_HOST_PASSWORD = '***' # 密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
#这样收到的邮件,收件人处就会这样显示
#DEFAULT_FROM_EMAIL = 'lqz<'306334678@qq.com>'
EMAIL_USE_SSL = True #使用ssl
#EMAIL_USE_TLS = False # 使用tls #EMAIL_USE_SSL 和 EMAIL_USE_TLS 是互斥的,即只能有一个为 True

view视图函数

    from django.core.mail import send_mail
import threading
from mybbs import settings t = threading.Thread(target=send_mail, args=("您的文章%s新增了一条评论内容" ,
'ddd',
settings.EMAIL_HOST_USER,
["616564099@qq.com"])
)
t.start()

一次性发多封邮件

from django.core.mail import send_mass_mail

message1 = ('第一封邮件标题', '这是邮件内容', 'from@example.com', ['first@example.com', 'other@example.com'])
message2 = ('第二封邮件标题', '这是邮件内容', 'from@example.com', ['second@test.com'])
'''
fail_silently: (可选)布尔值。为 False 时, send_mail 会抛出 smtplib.SMTPException 异常。smtplib 文档列出了所有可能的异常。 这些异常都是 SMTPException 的子类
'''
send_mass_mail((message1, message2), fail_silently=False)
'''
send_mail 每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 send_mass_mail 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 send_mass_mail 要优于 send_mail。
'''

携带附件或发送html(需要接收方支持)

from django.core.mail import EmailMultiAlternatives
# subject 主题 content 内容 to_addr 是一个列表,发送给哪些人
msg = EmailMultiAlternatives('邮件标题', '邮件内容', '发送方', ['接收方'])
msg.content_subtype = "html"
# 添加附件(可选)
msg.attach_file('test.txt')
# 发送
msg.send()

备注:send_mail 每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 send_mass_mail 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 send_mass_mail 要优于 send_mail。

二: 修改文章

前端代码

{% extends 'back/back_base.html' %}

{% block home %}

    <div>
<p>修改文章</p>
<form action="/add_article/" method="post">
{% csrf_token %} <p>标题</p>
<p><input type="text" name="title" class="form-control" id="title" article_id="{{ article_id }}"></p>
<p>内容(KindEdit编辑器,不支持拖放/粘贴上传图片)</p>
<p>
<textarea name="content" id="editor_id" cols="30" rows="10"> </textarea> </p>
<input type="submit" class="btn btn-danger" value="提交"> </form>
</div> <script charset="utf-8" src="/static/kindeditor/kindeditor-all.js"></script>
<script> KindEditor.ready(function (K) {
window.editor = K.create('#editor_id', {
width: '100%',
height: '500px',
//item 控制要显示的控件
//控制控件不能拖动
resizeType: 0,
//上传图片,uploadJson 指的是上传的路径,也就是咱们的路由
uploadJson: '/upload_img/',
//添加一些额外的参数
extraFileUploadParams: {
'csrfmiddlewaretoken': '{{ csrf_token }}',
'article_id': '1'
},
//修改默认上传文件的名字
filePostName: 'myfile' }) }); //当页面加载完成以后,发ajax请求,拿回文章数据 //jquery 的页面加载完成 $(function () {
var id = $("#title").attr('article_id')
$.ajax({
url: '/get_article/' + '{{ article_id }}',
type: 'get',
success: function (data) {
console.log(data)
$("#title").val(data.title)
// 设置HTML内容
window.editor.html(data.content); } })
})
/*
window.onload = function () {
//拿到我隐藏的id
var id = $("#title").attr('article_id')
$.ajax({
url: '/get_article/' + '{{ article_id }}',
type: 'get',
success: function (data) {
console.log(data)
$("#title").val(data.title)
// 设置HTML内容
window.editor.html(data.content); } }) }
*/
</script>
{% endblock %}

后台逻辑

@login_required
def update_head(request):
if request.method=='GET':
return render(request,'update_head.html')
else:
myfile = request.FILES.get('head')
# 可以只删除数据库的地址,不删实际文件
user = request.user
user.avatar = myfile
user.save() # 如果直接这样更新,不会带avatar那个路径,所以不能用这种方式来更新
# ret=models.UserInfo.objects.filter(pk=request.user.pk).update(avatar=myfile) return redirect('/index/') # def update_article(request,pk):
# if request.method=='GET':
# article=models.Article.objects.get(pk=pk)
# return render(request,'back/update_article.html',{'article':article}) def update_article(request,pk):
if request.method=='GET':
return render(request,'back/update_article2.html',{'article_id':pk}) def get_article(request,pk):
article=models.Article.objects.get(pk=pk) return JsonResponse({'title':article.title,'content':article.content})

BBS后台发送邮件&修改文章的更多相关文章

  1. 1211 BBS后台管理文章添加

    目录 昨日内容回顾 侧边栏inclusion_tag inclusion_tag的响应 使用 自定义inclusion_tag,标签,过滤器 文章的点赞点踩 前端 后端 校验规则 文章的评论功能 1. ...

  2. dedecms后台每页文章条数如何修改(“文档列表”每一页显示的文档条数)

    小明在学习采集,弄了个dedecms作为发布平台,几个小时后跑来报喜说好简单,但又不想制造那么多spam,每个分类只保留几条就好.在后台删除这些文章,每页只显示30个,看了下有100多页,立马沮丧了, ...

  3. Android 后台发送邮件 (收集应用异常信息+Demo代码)

    上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序.上次说的收集方法主要是把收集的信息通过Http的post请求把相关的异常信息变成请求参数发送到服务器.这个对做过web开发的人 ...

  4. 去除DEDECMS后台预览文章URL地址多余的数字信息

    在使用织梦模板时发现这样一个问题:在后台预览文章的时候,出现的文章网址尽管是静态URL,但是会在网址的尾部出现问号并跟随一个时间戳,在复制URL时就显得很不方便.那么如何解决这一问题呢? 经过查找资料 ...

  5. dedecms后台批量替换文章中的关键词

    DEDECMS怎么样能快捷或者批量修改网站所有文章的超链接和锚文本,超链和所有关键词锚文本的链接需要修改? dedecms后台批量替换文章中的关键词

  6. WordPress批量修改文章内容、URL链接、文章摘要

    通过SQL语句来批量修改wordpress博客内容,文章中所有语句都使用默认的wp_表前缀,如果您的数据表前缀不是wp_则需要在语句中作相应更改. 方法/步骤   批量修改文章内容 如果您想替换之前写 ...

  7. Django学习(八)---修改文章和添加文章

    博客页面的修改文章和添加新文章 从主页点击不同文章的超链接进入文章页面,就是传递了一个id作为参数,然后后台代码根据这个参数从数据库中取出来对应的文章,并把它传递到前端页面 修改文章和添加新文章,是要 ...

  8. dedecms批量修改文章为待审核稿件怎么操作

    dedecms批量修改文章为待审核稿件要怎么操作呢?因为我们有时会出于某些原因要把文章暂时先隐藏掉,dedecms有一个比较好的功能是将文件状态设为未审核前台就可以看不到了,那要怎么批量设置呢?到后台 ...

  9. ueditor1_4_3_3编辑器修改文章

    html的body中: <script id="editor" type="text/plain" ></script> js中: // ...

随机推荐

  1. centos6.x 配置bond

    centos6.x 配置bond centos6.x 配置bond1 物理网卡配置2 bond0网卡配置3 查看bond0网卡状态 摘要: centos6.x下使用双网卡配置bond0, centos ...

  2. 异常mongodb:Invalid BSON field name XXXXXX:YYYYY.zz

    1.本周遇到这个问题. 定位到发现一个很神奇的现象上面的结构无法顺利以map的key值存入mongodb里面. 而且到线上才发现这个问题. 而且是部分用户才会出现这样的情况 大部分人的该数据是这样的 ...

  3. Yii2 Post请求的时候出现400错误

    Bad Request (#400) Unable to verify your data submission.   http://www.yiiframework.com/forum/index. ...

  4. 安装nagios-plugins插件make时遇到的error

    安装nagios-plugins插件make时遇到的error error内容: check_http.c: In function ‘process_arguments’: check_http.c ...

  5. NIOS EDS最容易出错的地方

    越来越多的人使用NIOS II.毕竟,NIOS II是世界上功能最多的软核处理器. NIOS EDS通常是在装QUARTUS的时候一起装上的.通常我们在用的时候都是以模板建立工程的. 在很多情况下,我 ...

  6. 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

    SSL/TLS握手过程可以分成两种类型: 1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书.2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户 ...

  7. NSString 转换

    NSString *tempA = @"123"; NSString *tempB = @"456"; 1,字符串拼接 NSString *newString ...

  8. python学习笔记(三):文件操作和集合

    对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 文件基本操作: f = open('file.txt','r') #以只读方式打开一个 ...

  9. C语言的第二天-比较大小的小程序

    #include <stdio.h> int main() { int a,b,c,max; printf("请输入三个数:"); scanf("%d,%d, ...

  10. Java微信公众平台开发(二)--微信服务器post消息体的接收

    转自: http://www.cuiyongzhi.com/post/39.html 在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发 ...