我正在使用django作为我的播客的网络前端。我使用CDN来托管我所有的媒体,最近我想要同一个来托管我的RSS,而不是直接使用django.。
当前的设置有一些基本的已知原语:
path('podcast.xml', SubscribeFeed(), name='episode_feed'),一些附加的上下文;SubscribeFeed是一个基于https://docs.djangoproject.com/en/4.0/ref/contrib/syndication/#custom-feed-generators的联合源(https://github.com/django/django/blob/main/django/contrib/syndication/views.py#L27)
看起来有点像:
class iTunesFeed(Rss201rev2Feed):
content_type = 'application/xml; charset=utf-8'
def root_attributes(self):
attrs = super().root_attributes()
attrs['xmlns:itunes'] = 'http://www.itunes.com/dtds/podcast-1.0.dtd'
return attrs
< ... Ripped right from the custom feed generators with a ton of extra elements for the specific podcast category and such ... >
class SubscribeFeed(Feed):
title = "My Cool Podcast"
description = About.objects.first().about
author_email = "podcast@gmail.com"
author_name = "John Doe"
feed_type = iTunesFeed
def item_pubdate(self, item):
return item.pub_date
< ... More stuff that isn't relevant ... >只是明确地说,这个视图与Django完美地工作在一起,服务于播客RSS.,它可以在所有主要的平台上工作,而且非常好。
我的问题/问题是:我想生成/呈现这个视图到一个文本文件,目的是;我在CDN上托管媒体,我也将这个RSS放在一个单独的feeds.mypodcast.com CDN上。通过这种方式,django应用程序可以关闭,但提要和媒体仍然可以通过CDN访问。django应用程序只在关键路径上;插曲描述、联系人表单、网页ui插曲浏览等等。
我已经在跑芹菜,在一定的时间间隔内发布剧集,所以我的计划如下:
在模型save()函数之后创建一个异步函数
步骤2和步骤3非常简单,但是我很难生成一个文件。
我尝试过的事情:
podcast_feed.get_feed(podcast_feed.items(), <mocked request object>) **这当然“有效”,但是调用我自己的REST资源感觉很糟糕,也不是很好。get_feed()类型的函数。**这并不是真的起作用。阅读源代码后,我发现它相当依赖于一个有效的请求,而且我不认为我在架构上做的是正确的。(创建我自己的馈电发生器)render_to_string,但用于聚合提要。**这几乎立即停止。在一个正常的视图上工作得很好,但在提要上却找不到它。我把头撞在这上面已经有一段时间了。“隐藏”调度似乎是最安全、最有效的攻击,但我更愿意以正确的方式进行。
我真正想要的是建筑指导。怎样才是正确的方法?我希望找到一些明显的东西,比如render_to_string,但是用于联合提要。实现我自己的feedgenerator不是很好。
简单地解决用例的最佳途径是什么;将合并源视图呈现为文本文件
谢谢。
发布于 2022-02-11 08:05:52
我之所以选择我的答案,是因为我对问题集有更多的思考。Django的MVT/MVC模式确实不错,但我想我是想让它做一些它不应该做的事情。
如果我想从Django应用程序本身提供RSS提要,那么从模板ala中生成一个视图是很棒的。但正如问题中所述,我想将这个RSS提要写到某个远程CDN上。
我用rfeed编写了自己的包装器(注意: pypi中的包装器是一个旧的叉子……)。它把我所有的情节和播客元数据模型都拉进来,把它们输入到条目中,然后输入到提要中。
然后,我在模型保存(或计划的插播发布)上编写了一个简单的异步任务,它只生成rfeed RSS提要,创建S3对象,区分S3中的内容,然后有条件地推送S3并使cloudfront无效。
我非常喜欢这种方法,因为现在我的django应用程序会发生一些不好的事情,离线。所有的媒体和RSS现在都在CDN,该网站只是用来展示笔记,联系表格,关于我们,简单的事情。现在关键的问题是云提供商的问题。
发布于 2022-02-09 14:10:12
您可以在单独的视图中这样做:
def rss_feed_to_file():
response = SubscribeFeed()
# response is a HttpResponse object
# response.content contains the feed content which you could then save as whatever you like这能回答你的问题吗?
https://stackoverflow.com/questions/71043536
复制相似问题