Django联合框架:阻止将SITE_ID附加到链接

时间:2018-02-01 07:11:14

标签: django django-syndication

根据此处的文件:https://djangobook.com/syndication-feed-framework/

  

如果链接没有返回域,则联合框架将会   根据您的SITE_ID插入当前站点的域   设置

但是,我试图生成磁铁:链接。框架没有认识到这一点,并试图附加SITE_ID,这样链接就像这样(在localhost上):

<link>http://localhost:8000magnet:?xt=...</link>

有没有办法绕过这个?

3 个答案:

答案 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。希望在未来的补丁中,他们允许支持磁铁等协议。