我按照django 的 RSS 和 ATOM 提要的本教程进行操作,并让它工作。
但是,测试开发服务器不断让浏览器将提要下载为文件,而不是浏览器将其检测为 xml 文档。
我使用 HTTP 的经验告诉我,Content-Type 标头中缺少 mime 类型。
我如何在 django 中指定它?
我按照django 的 RSS 和 ATOM 提要的本教程进行操作,并让它工作。
但是,测试开发服务器不断让浏览器将提要下载为文件,而不是浏览器将其检测为 xml 文档。
我使用 HTTP 的经验告诉我,Content-Type 标头中缺少 mime 类型。
我如何在 django 中指定它?
Everyblock 源代码中有关于此的注释。
他们定义了一个类来替换标准 Django 提要的 mime 类型,如下所示:
# RSS feeds powered by Django's syndication framework use MIME type
# 'application/rss+xml'. That's unacceptable to us, because that MIME type
# prompts users to download the feed in some browsers, which is confusing.
# Here, we set the MIME type so that it doesn't do that prompt.
class CorrectMimeTypeFeed(Rss201rev2Feed):
mime_type = 'application/xml'
# This is a django.contrib.syndication.feeds.Feed subclass whose feed_type
# is set to our preferred MIME type.
class EbpubFeed(Feed):
feed_type = CorrectMimeTypeFeed
您是否使用 rss 的可用视图?这就是我的 urls.py 中的内容 - 我没有设置任何关于 mimetypes 的内容:
urlpatterns += patterns('',
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': published_feeds}, 'view_name')`,
)
published_feeds 类似于
class LatestNewsFeed(Feed):
def get_object(self, bits):
pass
def title(self, obj):
return "Feed title"
def link(self, obj):
if not obj:
return FeedDoesNotExist
return slugify(obj[0])
def description(self, obj):
return "Feed description"
def items(self, obj):
return obj[1]
published_feeds = {'mlist': LatestNewsFeed}
创建 HTTPReponse 对象时,您可以指定其内容类型:
HttpResponse(content_type='application/xml')
或者无论内容类型实际上是什么。
请参阅http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponse.__init__
我猜问题出在 OS X 上的 Camino 浏览器上,而不是 HTTP 标头和 mime 类型。
当我在 Safari 上尝试时,它起作用了。
在 9 年后使用 Firefox 和 Django 2.1 时,我仍然遇到了这个问题。
上面的解决方案没有解决它,所以我最终使用了这个:
class XMLFeed(Feed):
def get_feed(self, obj, request):
feedgen = super().get_feed(obj, request)
feedgen.content_type = 'application/rss+xml; charset=utf-8' # New standard
# feedgen.content_type = 'application/xml; charset=utf-8' # Old standard, left here for reference
return feedgen
使用此类而不是根据需要Feed
将 mime-type 设置为“application/rss+xml”。
更新
我注意到 mime 类型的“application/xml”已经过时,应该使用“application/rss+xml”。上面的代码已相应更新,但尚未经过测试。