我跟着this tutorial跟踪了django的RSS和ATOM提要,然后我开始工作了。
然而,测试开发服务器不断让浏览器将订阅源作为文件下载,而不是浏览器将其检测为xml文档。
我使用HTTP的经验告诉我,Content-Type标头中缺少mime类型。
如何在django中指定?
答案 0 :(得分:9)
Everyblock源代码中有关于此的注释。
他们定义了一个替换标准Django feed的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
答案 1 :(得分:3)
您是否使用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}
答案 2 :(得分:1)
创建HTTPResponse对象时,您可以指定其内容类型:
HttpResponse(content_type='application/xml')
或者实际上是什么内容类型。
请参阅http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponse.__init__
答案 3 :(得分:1)
我猜问题是OS X上的Camino浏览器,而不是HTTP头和mime类型。
当我尝试Safari时,它有效。
答案 4 :(得分:0)
9年后的Firefox和Django 2.1,我仍然遇到了这个问题。
上面的解决方案没有解决问题,所以我最终使用了它:
class XMLFeed(Feed):
def get_feed(self, obj, request):
feedgen = super().get_feed(obj, request)
feedgen.content_type = 'application/xml; charset=utf-8'
return feedgen
使用此类代替Feed
可以根据需要将mime类型设置为'application / xml'。