Джанго:Заголовок типа содержимого каналов RSS и ATOM?
-
20-08-2019 - |
Вопрос
Я последовал за ним этот учебник для RSS-каналов django и ATOM, и я заставил это работать.
Однако сервер тестовой разработки продолжает заставлять браузер загружать каналы в виде файла вместо того, чтобы браузер определял его как xml-документ.
Мой опыт работы с HTTP подсказывает мне, что в заголовке Content-Type отсутствует mime-тип.
Как мне указать это в django?
Решение 4
Я предполагаю, что проблема была с браузером Camino в OS X, а не с HTTP-заголовком и типом mime.
Когда я попробовал использовать Safari, это сработало.
Другие советы
В исходном коде Everyblock есть комментарий по этому поводу.
Они определяют класс, который заменяет mime-тип стандартного канала Django следующим образом:
# 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__
Я все еще сталкивался с этой проблемой 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' по желанию.