簡體   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