根据此处的文件:https://djangobook.com/syndication-feed-framework/
如果链接没有返回域,则联合框架将会 根据您的SITE_ID插入当前站点的域 设置
但是,我试图生成磁铁:链接。框架没有认识到这一点,并试图附加SITE_ID,这样链接就像这样(在localhost上):
<link>http://localhost:8000magnet:?xt=...</link>
有没有办法绕过这个?
答案 0 :(得分:1)
这有点粗糙,但如果您不想放弃Django框架,这是一个潜在的解决方案:
问题是方法add_domain
深埋在联合框架内的一个巨大的方法中,我没有看到一种干净的方法来覆盖它。由于此方法同时用于Feed网址和Feed项,因此add_domain
的猴子补丁需要考虑这一点。
Django来源: https://github.com/django/django/blob/master/django/contrib/syndication/views.py#L178
1:对您正在使用的Feed类进行子类化,并对巨大方法get_feed
进行复制粘贴覆盖
2:修改行:
link = add_domain(
current_site.domain,
self._get_dynamic_attr('item_link', item),
request.is_secure(),
)
类似于:
link = self._get_dynamic_attr('item_link', item)
答案 1 :(得分:1)
这是一种使用猴子修补的方法,更清洁。
我喜欢创建一个单独的文件夹&#34; django_patches&#34;对于这些事情:
的myproject / django_patches / __初始化__。PY
from django.contrib.syndication import views
from django.contrib.syndication.views import add_domain
def add_domain_if_we_should(domain, url, secure=False):
if url.startswith('magnet:'):
return url
else:
return add_domain(domain, url, secure=False)
views.add_domain = add_domain_if_we_should
接下来,将其添加到您的INSTALLED_APPS中,以便您可以修补该功能。
settings.py
INSTALLED_APPS = [
'django_overrides',
...
]
答案 2 :(得分:0)
我最终挖掘了整合的源代码并找不到简单的方法来覆盖它并做了一些hacky猴子修补。 (不幸的是,在我看到这里发布的答案之前我已经做过了,我认为所有这些都与这个一样有效)
以下是我的表现:
def item_link(self, item):
# adding http:// means the internal get_feed won't modify it
return "http://"+item.magnet_link
def get_feed(self, obj, request):
# hacky way to bypass the domain handling
feed = super().get_feed(obj, request)
for item in feed.items:
# strip that http:// we added above
item['link'] = item['link'][7:]
return feed
对于未来的读者,这是Django 2.0.1。希望在未来的补丁中,他们允许支持磁铁等协议。