django feed rss
RSS的基本原理
RSS是在互联网上被广泛采用的内容包装和投递协议。网络用户可以在客户端借助于支持RSS的新闻工具软件,在不打开网站内容页面的情况下,阅读支持RSS输出的网站内容。
<?xml version="1.0" encoding="gb2312" ?>
<rss version="2.0">
<channel>
<title>我的Blog</title> //channel的标题
<description>与我自己的技术Blog相关联</description> //channel的介绍
<link>http://counter.csdn.net/pv.aspx?id=72</link> //channel的url
<item>
<title><!-- 项标题 --></title> //item的标题
<link><!-- 项 URL --></link> //item的url
<description><!-- 简要描述 --></description> //item的介绍
<!-- 可选的/可扩展的元素 --> //item的其他属性,比如更新时间
</item>
<item>
<!-- 可多个<item>项目--> //一个channel有多个item
</item>
</channel>
</rss>
可以看到这个是RSS的基本定义,可以看到这里面定义的前三行为 title、description、link ,
后面是每一个item定义项。
有的网站提供了RSS自动发现机制,可以很方便地把RSS的URL添加到RSS阅读器中。如果没有自动发现,那么可以手动把RSS链接的URL添加到RSS阅读器中,这样就加入了一个用户订阅的频道。在RSS阅读器中可以更新频道列表或点击一个item链接打开该item的页面。
RSS工作机制
内容提供者在其网站上添加RSS的链接,以提供RSS订阅功能,当打开这个链接时,传送过去了一些频道信息,比如:blog的作者名。
一种做法是,RSS链接URL指向的是一个空内容的页面,该页面后台程序通过传过来的频道信息访问数据库,获取频道列表,用Response.Write向该空页面写出XML格式的文件。
另一种做法是,RSS链接URL指向的是一个xml文件,该文件由服务器的程序事先生成好的,放在服务器上,访问时静态获取,服务器在作者每添加一个频道列表时自动更新该xml文件。
第一种做法的优点是管理方便,因为不需要为每个频道生成xml文件,所有的RSS请求都由一个后台页面处理,接口统一,但每次访问RSS链接时,都要动态地写出RSS频道列表,访问效率相对较低,第二种做法的优点是访问时,只是返回一个静态的xml文件,不需要访问数据库来临时生成,所以访问效率相对较高,但每更新一次频道列表中的项时,就要自动地重新生成xml文件以保证RSS文件的最新,这样就降低了更新的效率。本系统中采用的是第一种方法。
django下面的实现
django自带了feed类来实现RSS,使用自带的feed非常简单,直接使用一个新的类,就可以了
from django.contrib.syndication.views import Feed
from django.core.urlresolvers import reverse
from policebeat.models import NewsItem
class LatestEntriesFeed(Feed):
title = "Police beat site news"
link = "/sitenews/"
description = "Updates on changes and additions to police beat central."
def items(self):
return NewsItem.objects.order_by('-pub_date')[:5]
def item_title(self, item):
return item.title
def item_description(self, item):
return item.description
# item_link is only needed if NewsItem has no get_absolute_url method.
def item_link(self, item):
return reverse('news-item', args=[item.pk])
title, link 和 description 分别对应 RSS的 , 和 。
其中在items中可以取得所有的需要的对象,在item_title里面返回相关的标题,item_description里面返回详细内容,item_link返回拼装后的链接。
如果你要创建一个Atom feed,而不是RSS feed,你需要使用subtitle属性替代description。查看Publishing Atom and RSS feeds in tandem 里面的例子
然后在url中进行定义
from django.conf.urls import url
from myproject.feeds import LatestEntriesFeed
urlpatterns = [
# ...
url(r'^latest/feed/$', LatestEntriesFeed()),
# ...
]
阿里云安装pip镜像配置
阿里云安装pip
在阿里云上使用默认的pip源的时候,经常出现下载很慢,或者有时候出现根本无法下载的情况。只有加载本地的源才行。
pip镜像列表
pip的镜像可以在这里查看 https://pypi-mirrors.org/
可以看到其中已经有了aliyun的镜像,赶紧点进去看看,发现https的是打不开的,只有选择http的。
http://mirrors.aliyun.com/pypi/simple/
访问这个可以进去看看
这里也推荐可以使用pypi.douban.com 豆瓣的或者 其他的。我的直接在阿里云上所以就直接选择阿里云的镜像了,实测也是最快的,下载速度可以到几M
配置pip配置文件
在root目录下创建文件 ~/.pip/pip.conf
详细的配置如下:
[global]
timeout = 6000
index-url = http://mirrors.aliyun.com/pypi/simple
[install]
use-mirrors=true
mirrors= http://mirrors.aliyun.com
trusted-host=mirrors.aliyun.com
安装pip包
django 富文本RSS防御
富文本攻击
在富文本编辑器中,可以写入一些相关的html等,在我们读出到页面的时候,由于为了省去html标签,所以一般会使用safe过滤器进行过滤。攻击者可以在富文本编辑器中输入 等方式来进行富文本的攻击。
基本方法
一般可以采用removetags的方式来进行去掉某些关键标签,这在简单的情况下是适用的,如下:
{% if rtf_con %}
{{ rtf_con | removetags:"script " | safe }}
{% endif %}
但是这种方式只能过滤掉某些标签,过滤情况不完全,如大小写之类的便无法过滤。而html又是不标准的,所以很多情况下是过滤不完全的。
使用python-xss-filter防护
富文本XSS基本上使用白名单进行过滤,通过白名单的仅留下需要使用、并且基本不产生危害的标签和属性。
https://github.com/phith0n/python-xss-filter
直接使用python-xss-filter进行富文本的过滤。
基本文本的XSS防御
Django默认开启了输入转义来防范XSS,可以使用两种方法来关闭自动转义
方法一:使用过滤器“|safe”关闭单个变量的自动转义
<h1>Submit-Content</h1>
{{ xss_content | safe}}
方法二:使用{%autoescape off%}的方式关闭代码段的自动转义
{% autoescape off %}
<h1>Submit-Content</h1>
{{ xss_content }}
{% endautoescape %}
在autoescape off中可以局部开启autoescape,使用{% autoescape on%}即可
建议在非必要的情况下,不要关闭Django的自动转义功能。
代码检查:视图模版中是否使用了{{date|safe}}、{%autoescape off%}…{%endautoescape%}
django pagedown web 编辑器
django markdown web 编辑器大概的介绍
几个编辑工具
简书,一个在线轻博客网站,我正在用的。
Mou OSX 下面的markdown编辑器。支持主题模式及部分的代码模式
csdn csdn最近也开始支持markdown的编辑器了。
stackio,在线编辑器,双页面的模式,非常不错,做的非常不错,如果做博客编辑后续可以专门配置。
markable, 在线编辑器,不太适用
dillinger,和stackio类似,可以直接使用。
js插件式
epiceditor, 这个用的人比较多,直接用js就可以集成,也可以直接看。没有扩展按钮,更加适用于专业的IT人事。
MarkdownEditing,比较专注的markdown编辑器,暂时还没有时间研究
remark,同样的也是插件维护
pagedown-bootstrap,使用bootstrap维护的markdown 编辑器,适用于手机
markdown-js
django下的插件形式
django-pagedown, 当前选择使用的markdown编辑器,可以直接在django里面使用,比较方便。
django-markdownx,同样支持两版展示,觉得没有django-pagedown展示效果好,后续再做具体实验。
django-pagedown
安装
- 使用pip 安装 django-pagedown:
pip install django-pagedown - 在 setting.py 文件的
installed_app文件里面添加pagedown
配置
全局替换模式
直接在全局里面配置,在某一个面板中配置这个的话会覆盖这个面板里面的所有TextField的默认widget。
这种模式最直接也最直观的进行了修改
from pagedown.widgets import AdminPagedownWidget
from django.db import models
class FooModelAdmin(models.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': AdminPagedownWidget },
}
其他模式
其他详细模式可以参考项目的git 上面的参考文档 django-pagedown
django-markdown-deux解析markdown
在django 1.6版本就不支持django-markdown包了,这个包很好的完善了这个功能。
安装
使用 sudo pip install django-markdown-deux来安装即可
有的地方要提示安装markdown2,但是在安装完成之后就可以看到用pip实际把这个包就已经安装进来了
Successfully installed django-markdown-deux-1.0.5 markdown2-2.3.1
当然不要忘记吧markdown-deux装入app中。
直接使用
如果确定Text中只有markdown标签,不进行html标签解析的话,可以直接加入通道标签就可以使用
在模板中添加标签load
{% load markdown_deux_tags %}
在页面中加通道渲染
{{ content|markdown }}
自定义markdown filter
新建一个包文件夹templatetags,然后在里面添加__init__.py和 djangomarkdown.py 。这个djangomarkdown模板是以后模板过滤器使用的。也不要和现在的模板过滤器冲突了。
myproject/
myapp/
__init__.py
models.py
templatetags/
__init__.py
djangomarkdown.py
views.py
djangomarkdown.py
# -*- coding: utf-8 -*-
import markdown2
from django import template
from django.template.defaultfilters import stringfilter
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter(is_safe=True)
@stringfilter
def djangomarkdown(value):
return mark_safe(markdown2.markdown(force_unicode(value),
extras=["code-friendly"]
)
)
在extras可以填入具体的参量,用于使用markdown的扩展语法。
完成后就可以同时过滤HTML标签和markdown标签了。
markdown-deux 的一些介绍
详情可以参考django-markdown-deux github页面。
django 标签
django 标签
安装
安装django-tagging
sudo pip install django-tagging
添加tagging到环境
- 在setting的INSTALLED_APPS中添加'tagging'APP
- 运行 manage.py makemigration
- 运行 manage.py migrate
- 运行工程
创建tags
在模型层创建tans,然后
tags = TagField()
运行 manage.py makemigration
运行 manage.py migrate
一下其他的详情稍后整理到tagging文档中。
详情请参考django参考文档
Copyright © 2020 鄂ICP备16010598号-1