关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
之前我查看有没有人评论我的博文都是登录后台去查看。这样会导致查看不及时,而且我回复了其他人的评论,其他人也不知道我回复了。因为他们没法登录我的后台去查看。
由于注册用户我设置的用户是邮箱,所以考虑只要有评论或者回复,就发送一个邮件给对应的用户。
那么,又要对Comments库“开刀”了。
评论处理的方法在comments库中,这个也限制了评论或回复之后的动作要在comments库中完成。
我用的是WebFaction服务器,comments评论库的具体路径是"~/lib/python2.7/django_contrib_comments-1.6.2-py2.7.egg/django_comments/"。comments库的结构在前面博文也有介绍,这里就不多说了。
要写代码的地方确定之后,可以进一步开发了。发送邮件的类型大致可以分为两种:简单文本邮件和复杂的Html邮件。为了更好的显示内容,一般都是采用html邮件。既然涉及到html,我们可以采用模版的形式加载html内容,不用每次都用代码去构造html页面。
在Comments库的views目录,添加发送邮件的Python脚本(文件名命名为email.py)代码如下:
#coding:utf-8 """ Author: Haddy Yang Date: 2016-05-12 Descript: Send Email """ from django.core.mail import send_mail from django.core.mail import EmailMessage from django.template import loader from django.conf import settings class SendEmail(): """send email""" def ___init__(self): pass def send_html_email(self, subject, html_content, to_list): """发送html邮件""" send_from = settings.DEFAULT_FROM_EMAIL msg = EmailMessage(subject, html_content, send_from, to_list) msg.content_subtype = "html" #设置类型为html msg.send() def send_text_email(self, subject, body, to_list, is_fail_silently=False): """发送简单的文本邮件""" send_from = settings.DEFAULT_FROM_EMAIL send_mail(subject, body, send_from, to_list, fail_silently = is_fail_silently) def send_email_by_template(self, subject, module, data, to_list): """ 使用模版发送邮件 subject: string, 主题 module: string, 模版名称 data: dict, 数据 to_list: list, 收件人 """ html_content = loader.render_to_string(module, data) self.send_html_email(subject, html_content, to_list)
这个脚本封装了3个发送邮件的方法。
这样就可以发送邮件了?假如没有在settings.py配置相关的邮箱设置,就发送不了。可以参考《我的网站搭建(第12天) 关闭调试》和《Django在WebFaction服务器的邮箱设置》
打开Comments库的templates目录,创建文件夹email,添加两个模版文件,分别是评论和回复发送邮件使用的模版。
评论邮件模版:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <style type="text/css"> body{ font-family:'Microsoft YaHei', 宋体, Tahoma, Helvetica, Arial, 宋体, sans-serif; } </style> </head> <body> <div style=" margin-left: 1em; "> <p>有人评论了你的博文 <a href="{{ comment_url }}">点击查看</a></p> <p style=" background-color: #E0E0E0; padding: 1em 0.5em; /*width: 35em;*/ border-radius: 6px; font-size: small; ">{{ comment_name }}:“{{ comment_content }}”</p> </div> <div style=" margin-top:1.5em; margin-right:3em; font-size:small; text-align:right; "> <a href="http://yshblog.com/" style=" text-decoration: none; color:#517CAF; margin-left:1em; "> 杨仕航的博客 </a> <span>(一个原创高质量的技术博客)</span> </div> </body> </html>
回复邮件模版:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <style type="text/css"> body{ font-family:'Microsoft YaHei', 宋体, Tahoma, Helvetica, Arial, 宋体, sans-serif; } </style> </head> <body> <div style=" margin-left: 1em; "> <p>有人回复了你的评论 <a href="{{ comment_url }}">点击查看</a></p> <p style=" background-color: #E0E0E0; padding: 1em 0.5em; /*width: 35em;*/ border-radius: 6px; font-size: small; ">{{ comment_name }}:“{{ comment_content }}”</p> </div> <div style=" margin-top:1.5em; margin-right:3em; font-size:small; text-align:right; "> <a href="http://yshblog.com/" style=" text-decoration: none; color:#517CAF; margin-left:1em; "> 杨仕航的博客 </a> <span>(一个原创高质量的技术博客)</span> </div> </body> </html>
这两个模版基本一样,就是文字略不同,而且都有共同的参数:
1、comment_url:评论或回复的链接
2、comment_name:评论或回复的人
3、comment_content:评论或回复的内容
再打开Comments库的view文件夹,修改comments.py文件,加上发送邮件的处理代码。
这个文件代码有点多,我只把添加的代码写出来。
导入相关内容:
#coding:utf-8 from . import email #导入当前文件夹的email.py
post_comment方法,最后返回提交成功前,写发送邮件代码:
try: #判断评论对象是否为博文 if str(comment.content_type) == 'blog': send_email = email.SendEmail() #设置模版对应的参数 email_data = { 'comment_name' : data["name"], 'comment_content' : comment.comment, 'comment_url' : u'http://yshblog.com/blog/%s#F%s' % (comment.object_pk, comment.id)} subject = '' #邮件主题 template = '' #使用的模版 to_list = [] #收件人 if int(comment.root_id) == 0: subject = u'[杨仕航的博客]博文评论' template = 'email/comment.html' #发送给自己(可以写其他邮箱) to_list.append(settings.DEFAULT_FROM_EMAIL) else: subject = u'[杨仕航的博客]评论回复' template = 'email/reply.html' #获取评论对象,找到回复对应的评论 comment_model = django_comments.get_model() cams = comment_model.objects.filter(id = comment.reply_to) if cams: to_list.append(cams[0].user_email) else: #没有找到评论,就发给自己(可以修改其他邮箱) to_list.append(settings.DEFAULT_FROM_EMAIL) #根据模版发送邮件 send_email.send_email_by_template(subject, template, email_data, to_list) else: #其他类型的评论暂不处理 pass except Exception as e: #ResponseJson方法是我前面自己加的,可以参考上一篇博文 return ResponseJson(200, True, e.message)
最后,还需要修改一下前端页面。点击打开邮件里面的链接需要跳转到对应的评论或回复上面。
大致链接是这样的:http://yshblog.com/blog/41#F39
#F39是评论或回复的id,需要在博文显示评论的模版给评论或回复加上name属性。
<div class="blog_comment" name="F{{comment.id}}">...</div>
打开页面的时候,用js代码获取这个参数调整。js代码如下(引用了jQuery库):
//定位到评论位置 if(window.location.hash!=""){ //根据名称获取元素 obj = document.getElementsByName(window.location.hash.split("#")[1])[0]; //DOM对象转为jQuery对象 var $obj = $(obj); //定位到评论或回复的位置 $("body,html").animate({ scrollTop: $obj.offset().top - 70 }, 0); }
这样就为评论和回复添加了发送邮件功能,可以及时知道评论和绑定用户更加紧密。
上一篇:Access文本框value属性和text属性的区别
相关专题: Django评论库开发