关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
在前面开发中,我的网站搭建(第18天) 评论或回复发送邮件通知给django-comments库添加发送邮件通知的功能。
邮件内容需要添加一个链接,让收到邮件的用户可以直接点击链接调整到被评论的位置。
而该链接需要通过url反向解析获取或者固定一个链接。
一环扣一环。为了方便,在前面开发时,就限定只有blog应用可以发送邮件。
由于,我添加了新应用:专题。我也希望每个专题也能被评论,评论之后也能发送邮件。
那么,需要想办法要去掉该限制。
为了评论能够通知作者,给专题的模型添加作者字段。(和blog一样的结构)
通过作者字段,可以获取到作者的邮箱并给作者发送邮件。可见我的网站搭建(第36天) 统一用户管理。
我在创建专题模型时,已经加入该字段。
在django-comments中,使用了ContentType。
我们可以通过ContentType获取被评论的对象。
#获得被评论的对象 content_type = comment.content_type model_object = content_type.get_object_for_this_type(id=comment.object_pk) email_address = model_object.author.email #获取被评论对象的作者邮箱
解决邮箱问题,接下来再觉得邮件中链接的问题。我们不知道该对象显示页面的url链接是什么。
博客和专题两个模型的url链接解析不一样。我们可以用if判断该对象类型,针对不同模型解析url。
不过,这样显得代码有些冗余。
既然在页面上评论,那么我们可以获取当前页面的链接。把该链接当作数据传递进来。
首先,给前端页面的评论框部分form表单中添加如下字段:
<input type="hidden" name="src_url" value="{{request.get_raw_uri}}"/>
这样提交数据的时候,会将当前页面的原始链接传递给后台。
鉴于前端不安全性质,在后台处理评论时,需要验证一下该网址。
打开django-comments库(我已单独复制一份到本项目),找到views文件夹中的comments.py文件。
在评论完成和发送邮件之前的位置,添加如下代码:
root_url = 'http://yshblog.com/' src_url = data.get('src_url', root_url) #判断网址开头是否是本域名 if not src_url.startswith(root_url): src_url = root_url #调用发送邮件代码 send_comment_email(comment, src_url)
send_comment_email方法是前面封装的,添加src_url参数,接受传递进来的链接。修改该方法的代码如下:
#coding:utf-8 #我自己写的发送邮件辅助模块,可参考 http://yshblog.com/69 from helper.email import send_email_by_template #我将django_comments复制到本项目,引用的路径 from apps_third_party import django_comments def send_comment_email(comment, src_url='http://yshblog.com/'): #获得被评论的对象 content_type = comment.content_type model_object = content_type.get_object_for_this_type(id=comment.object_pk) email_address = model_object.author.email #获取被评论对象的作者邮箱 #构造评论模版所需的数据 email_data = {} email_data['comment_name'] = comment.name email_data['comment_content'] = comment.comment email_data['comment_url'] = u'%s#F%s' % (src_url, comment.id) #其他设置 to_list = [] if int(comment.root_id) == 0: subject = u'[杨仕航的博客]有人评论' template = 'email/comment.html' to_list.append(email_address) 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(email_address) #根据模版发送邮件 send_email_by_template(subject, template, email_data, to_list)
如何一来,就解除了评论发送邮件的限制。
相关专题: Django评论库开发