繁体   English   中英

Django联合组织框架:防止将SITE_ID附加到链接

[英]Django syndication framework: prevent appending SITE_ID to the links

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

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

但是,我正在尝试生成一个磁铁供稿:链接。 框架无法识别这一点,并尝试附加SITE_ID,以使链接最终如下所示(在localhost上):

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

有没有办法绕过这个?

这有点过时,但是如果您不想放弃Django框架,则可以使用以下解决方案:

问题在于方法add_domain被深埋在联合框架内的一个巨大方法中,我看不出一种覆盖它的干净方法。 由于此方法同时用于提要URL和提要项,因此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)

这是用猴子补丁做的一种方法,更清洁。

我喜欢为这些事情创建一个单独的文件夹“ django_patches”:

myproject / django_patches / __ init__.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',
    ...
]

最后,我确实仔细研究了联合源代码,发现没有简单的方法可以覆盖它,并做了一些骇人听闻的猴子补丁。 (不幸的是,在我看到这里发布的答案之前,我已经做到了,我认为所有答案都将和这个答案一样有效)

这是我的操作方式:

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起。 希望在将来的补丁中,它们可以支持像磁铁这样的协议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM