django其他操作
目录
1,发送邮件
2,分页器
3,站点地图
4,RSS订阅功能
5,自定义上下文处理器
发送邮件
django提供了一个发送邮件的接口,相比python的smtplib库,发送的速度更快。
settings.py文件配置
# settings.py
EMAIL_USER_SSL = True
EMAIL_HOST = "smtp.qq.com"
EMAIL_PORT = 25 # 端口
EMAIL_HOST_USER = '1904981400@qq.com' # 写自己的发送邮件的账号
EMAIL_HOST_PASSWORD = 'rvgenfvumbcncgia' # 写自己的授权码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
授权码的获取方式:https://zhidao.baidu.com/question/878811848141402332.html
python3 manage.py sendtestemail 1904981400@qq.com
如果收到邮件,则代表配置没问题。
发送一封邮件
from django.core.mail import send_mail
from testblog.settings import DEFAULT_FROM_EMAIL
email_title = "注册验证码"
email_body = "您的验证码为1543。"
email_to = 'catfish1921@outlook.com' # 写你要发送的对象
send_status = send_mail(email_title, email_body, DEFAULT_FROM_EMAIL, [email_to], fail_silently=False)
如果send_status返回1,则发送成功,否则发送失败。
一次性发送多封邮件
from django.core.mail import send_mass_mail
message1 = ('caption1', 'content1', '1904981400@qq.com', 'catfish1921@outlook.com')
message2 = ('caption2', 'content2', '1904981400@qq.com', 'catfish1921@outlook.com')
send_mass_mail((message1,message2),failsilently=False)
发送复杂邮件
如果要发送复杂邮件,就需要使用EmailMultiAlternatives类。使用这个类,可以发送html格式的超文本,也可以添加附件到其中。
from django.core.mail import EmailMultiAlternatives
msg = EmailMultiAlternatives('这是一封带有附件的消息', '<p>这是消息的内容</p>', DEFAULT_FROM_EMAIL, [email_to])
msg.content_subtype = 'html' # 默认为plain,即纯文本
msg.attach_file('/home/catfish/桌面/点赞') # 添加附件,可以选择是否添加
msg.send()
在服务器上无法发送邮件
原文:https://www.cnblogs.com/ssjt/articles/10540593.html
更改服务器端口EMAIL_PORT为465,然后添加如下两行代码:
EMAIL_USE_SSL = True
CONFIRM_DAYS=2
django分页器
django内置分页器的使用如下:
from django.core.paginator import Paginator
p = Paginator(objects, 2) # 分页器对象
## 分页器对象的方法
'''
count 总数
num_pages 总页数
page_range 页数范围
page(num) 获得第几页实例
'''
## 每一页对象
'''
object_list 这一页中的所有对象
has_previous() 前面是否有页数
has_next() 后面是否有页数
next_page_number() 获取上一页页码
previous_page_number() 获取下一页页码
'''
Copy
django站点地图
在INSTALL_APP中注册
'django.contrib.sitemaps',
Copy
注意:这里只添加django.contrib.sitemaps,如果多添加了一个django.contrib.sites会报错:Site matching query does not exist.
编辑urls.py文件
# urls.py文件
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from blog.models import Blog
sitemaps = {
'blog': GenericSitemap({'queryset': Blog.objects.all(), 'date_field': 'date'}, priority=0.6),
}
patterns = [
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]
Copy
好了,站点地图就完成了!
踩坑:'Blog' object has no attribute 'get_absolute_url'
解决方法:在models.py的相关类中定义一个get_absolute_url方法,并返回相关url链接。
RSS订阅
出自:https://blog.csdn.net/jiangxfone/article/details/90549587
第一步:在你要定义的应用下新建feed.py文件,然后写入:
from django.contrib.syndication.views import Feed
from django.shortcuts import reverse
from blog.models import Blog
class BlogFeed(Feed):
title = 'catfish的个人博客'
description = '一个用来分享知识的个人博客'
link = "/"
def items(self):
return Blog.objects.all()
def item_title(self, item):
return item.title
def item_description(self, item):
return item.content
def item_link(self, item):
return reverse('blog:article', args=(item.id,))
Copy
然后在urls.py中绑定:
from blog import feed
urlpatterns = [
path('rss/', feed.BlogFeed(), name='rss'),
]
Copy
完毕!
自定义上下文处理器
如果有些数据希望全局都能使用可以使用上下文管理器。使用方法如下:
第一步:在app中创建一个文件,文件名自己定,我演示的这个app名叫blog,文件名为context_processors.py。
第二步:在context_processors.py文件中添加如下代码:
def youknow(request):
context = {}
context['one'] = 'hello world!'
return context
Copy
第三步:在settings.py文件中配置相关文件:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'blog.context_processors.youknow',
],
},
},
]
Copy
第四步,在模板中使用。
{{ one }}
Copy
如果显示"hello world!",则定义成功!