我的网站搭建(第51天) 解除评论发送邮件限制

  • 发布时间:2017年4月5日 10:53
  • 作者:杨仕航
* 该文是基于Python2.7开发的,最新Python3.x和Django2.x视频教程可以前往 >> Django2.0视频教程

在前面开发中,我的网站搭建(第18天) 评论或回复发送邮件通知给django-comments库添加发送邮件通知的功能。

邮件内容需要添加一个链接,让收到邮件的用户可以直接点击链接调整到被评论的位置。

而该链接需要通过url反向解析获取或者固定一个链接。

一环扣一环。为了方便,在前面开发时,就限定只有blog应用可以发送邮件。

20170405/20170405095636859.png

由于,我添加了新应用:专题。我也希望每个专题也能被评论,评论之后也能发送邮件。

那么,需要想办法要去掉该限制。


为了评论能够通知作者,给专题的模型添加作者字段。(和blog一样的结构)

通过作者字段,可以获取到作者的邮箱并给作者发送邮件。可见我的网站搭建(第36天) 统一用户管理

我在创建专题模型时,已经加入该字段。

20170405/20170405103812039.png


在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)


如何一来,就解除了评论发送邮件的限制。

上一篇:Python读写XML文档(lxml方式)

下一篇:我的网站搭建(第50天) 添加专题

相关专题: Django评论库开发   

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空