Django之博客系统邮件分享博客
在上一章中,我们创建了一个基础的博客应用,我们能在http://127.0.0.1:8000/blog/显示我们的博客。在这一章我们将尝试给博客系统添加一些高级的特性,比如通过email来分享帖子,添加评论,给帖子打上tag.
通过email分享帖子:
要通过email来分享帖子,需要我们创建一个表单来填写姓名,email,收件人。因此第一步就是通过django来创建表单。首先在blog应用的目录下创建一个forms.py文件。输入以下代码:
from django import forms
class EmailPostForm(forms.Form):
name=forms.CharField(max_length=25)
email=forms.EmailField()
to=forms.EmailField()
comments=forms.CharField(required=False,widget=forms.Textarea)
通过这个集成Form类的表单。我们就可以对页面上提交的数据进行验证。当表单提交从成功后必须创建一个新的视图来操作表单和发送email。编辑views.py文件,添加如下代码:
from .forms import EmailPostForm
def post_share(request,post_id):
post=get_object_or_404(Post,id=post_id,status='published')
if request.method == 'POST':
form=EmailPostForm(request.POST)
if form.is_valid():
cd=form.cleaned_data
#send email
else:
form=EmailPostForm()
return render(request,'post/share.html',{'post':post,'form':form})
在这个视图函数中,完成了如下的工作
1 定义post_share视图,参数为request和post_id
2 使用get_object_or_404快捷方法通过ID获取对应的帖子,并且确保每个帖子都是published状态
3 对提交的表单数据进行验证,如果验证通过则通过form.cleaned_data获取验证过的数据
接下来就要配置Django发送email:
首先,你需要有一个本地的SMTP服务或者通过在你项目的settings.py文件中添加以下设置去定义一个外部SMTP服务器的配置:
- EMAIL_HOST: SMTP服务地址。默认本地。
- EMAIL_POSR: SMATP服务端口,默认25。
- EMAIL_HOST_USER: SMTP服务的用户名。
- EMAIL_HOST_PASSWORD: SMTP服务的密码。
- EMAIL_USE_TLS: 是否使用TLS加密连接。
- EMAIL_USE_SSL: 是否使用隐式的SSL加密连接。
在settings.py中配置如下:
EMAIL_HOST = 'smtp.163.com'
EMAIL_HOST_USER = 'maple412@163.com'
EMAIL_HOST_PASSWORD = 'xxxx'
EMAIL_PORT = 25
EMAIL_USE_TLS = True
配置好了,我们来实际测试一下:打开shell功能
zhf@zhf-maple:~/py_prj/mysite$ python manage.py shell
Python 2.7.14 (default, Sep 23 2017, 22:06:14)
Type "copyright", "credits" or "license" for more information.
IPython 5.5.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [3]: from django.core.mail import send_mail
In [4]: send_mail('Django email','This is email from django test','maple412@163.com',['179039149@qq.com'],fail_silently=False)
Out[4]: 1
send_mail()方法需要这些参数:邮件主题,内容,发送人以及一个收件人的列表。通过设置可选参数fail_silently=False,我们告诉这个方法如果email没有发送成功那么需要抛出一个异常。如果你看到输出是1,证明你的email发送成功了。
既然测试成功,那么我们把发送邮件的功能添加到试图函数中去
def post_share(request,post_id):
post=get_object_or_404(Post,id=post_id,status='published')
send=False
if request.method == 'POST':
form=EmailPostForm(request.POST)
if form.is_valid():
cd=form.cleaned_data
subject='{}({}) recommends you reading "{}"'.format(cd['name'],cd['email'],post.title)
message='Read "{}" at {}\n\n{}\'s comments'.format(post.title,cd['name'],cd['comments'])
send_mail(subject,message,'maple412@163.com',[cd['to']])
send=True
#send email
else:
form=EmailPostForm()
return render(request,'post/share.html',{'post':post,'form':form,'send':send})
在这里我们声明了一个sent变量并且当帖子被成功发送时赋予它True。当表单成功提交的时候,我们之后将在模板(template)中使用这个变量显示一条成功提示。
视图函数已经完成,最后要做的就是添加路由
url(r'^(?P<post_id>\d+)/share/$',views.post_share,name='post_share'),
视图和url都配置完了后,最后就剩下配置模板了
1 在post目录下创建一个share.html, 在该文件中添加如下代码:
{% extends "blog/base.html" %}
{% block title %}Share a post{% endblock %}
{% block content %}
{% if send %}
<h1>E-mail successfully sent</h1>
<p>
"{{ post.title }}" was successfully sent to {{ cd.to }}.
</p>
{% else %}
<h1>Share "{{ post.title }}" by e-mail</h1>
<form action="." method="post">
{{ form.as_p }}
{% csrf_token %}
<input type="submit" value="Send e-mail">
</form>
{% endif %}
{% endblock %}
这里通过传入的send参数来判断邮件是否发送成功.如果发送成功,则显示发送的博客名称,发送人和接受人.
2在list.html中添加如下代码,也就是添加一个分享博客的url链接.这个url正好的组成是blog+post.id+share,正好对应url(r'^(?P<post_id>\d+)/share/$',views.post_share,name='post_share')这个URL
<a href="/blog/{{ p.id }}/share">
分享这篇博客
</a>
</p>
现在来进行测试.进入如下界面

点击分享这篇博客,在下面界面中填写信息

发送成功后跳转到发送成功的界面

Django之博客系统邮件分享博客的更多相关文章
- 【django之博客系统开发】
一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...
- day09搭建均衡负载和搭建BBS博客系统
day09搭建均衡负载和搭建BBS博客系统 搭建BBS博客系统 本次搭建bbs用到的技术 需要用到的: 1.Nginx+Django 2.Django+MySQL 环境准备 主机 IP 身份 db01 ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文
一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...
- Django之博客系统:增加评论
3既然是博客,那肯定就有留言评论系统.在这一章就来建立一个评论系统. 1 创建一个模型来保存评论 2 创建一个表单来提交评论并且验证输入的数据 3 添加一个视图函数来处理表单和保存新的评论到数据库 4 ...
- 这几天有django和python做了一个多用户博客系统(可选择模板)
这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...
- 【完全开源】Django多人博客系统——支持MarkDown和tinyMce
目录 说明 功能 如何使用 说明 这是一个用Django开发的多人博客系统,功能简单,但完全满足公司内部或个人的博客使用需求.支持普通富文本编辑器(tinyMCE)和MarkDown编辑器 由于嫌弃D ...
- django初探-创建简单的博客系统
django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...
- django初探-创建简单的博客系统(二)
上篇django初探-创建简单的博客系统(一)已经记录了Django实现博客的发布的整个过程,接下来继续说明博客标题和内容的显示. 显示博客详细 将博客内容保存到数据库还不是发布博客的终极目的,博客一 ...
- Django(博客系统):基于pycharm如何一个django工程下创建多个app
背景:通常我们创建一个django系统时,为了把业务模块划分清楚往往会把一个独立的业务模块放到一个app中,如果多个独立的业务模块就会创建多个app,一般情况下为了更好的管理这些app,会把他们都存放 ...
随机推荐
- CUDA Pro Tip: Optimized Filtering with Warp-Aggregated Atomics
In this post, I’ll introduce warp-aggregated atomics, a useful technique to improve performance when ...
- MongoDB 3.4 高可用集群搭建(二)replica set 副本集
转自:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<MongoDB 3.4 高可用集群搭建(一):主从模式&g ...
- 2015 浙江省赛 H - May Day Holiday
H - May Day Holiday As a university advocating self-learning and work-rest balance, Marjar Universit ...
- 【OK210试用体验】进阶篇(2)视频图像采集之MJPG-streamer编译(arm移植)
上一篇([OK210试用体验]进阶篇(1)视频图像采集之MJPG-streamer编译(Ubuntu系统下))进行了MJPG-streamer在Ubuntu下的编译及测试,这一篇针对OK210,进行a ...
- oracle sql 函数
(7)查询日期之间的数据 例如查询student表中出生日期(birthday)在’2016-01-01’ 和’2017-01-01’之间的数据: select * from student wher ...
- DDD学习笔录——领域驱动设计的常见误区(即错误的理解)
可以将DDD看成一种开发思想体系:它促成了一种新的以领域为中心的思维方式. 它是一种学习过程,而非最终目标,这就是DDD的最大优势. 任何团队都可以编写一个软件来满足一组用例的需求,但那些将时间和精力 ...
- UML在需求分析阶段的应用
转自:https://www.cnblogs.com/fuhaots2009/p/3430666.html 上一篇博客写了uml在软件开发过程中的应用,这以篇要详细介绍一下UML在需求分析过程中的应用 ...
- AFNetworking-2.5-源码阅读剖析--网络请求篇
一.前言 AFNetworking,非常友好简单的网络请求第三方框架,在GitHub中已经获得了25000++的star,链接地址:https://github.com/AFNetworking/AF ...
- java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
执行Hive查询: Console是这样报错的 java.sql.SQLException: Error from org.apache.hadoop.hive.ql.exec.mr.MapRedTa ...
- 【273】利用ArcPy建立处理数据的脚本
这个脚本可以直接运行处理程序,首先在 ArcPy 上面测试,成功后写入文件,下面的代码实现将指定文件夹内部的栅格数据进行 Calculate Statistics 操作,否则在进行专题图制作的时候会出 ...