[英]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.