gpt4 book ai didi

python - 将子域包含到 Django 站点地图 url 的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-28 20:20:11 25 4
gpt4 key购买 nike

我有我的开发站点(localhost.com '在开发机器上')。

这个域有两个子域,developerblog

站点地图的 url 配置是,

from django.contrib.sitemaps.views import sitemap, index as sitemap_index

url(r'^sitemap\.xml$', sitemap_index, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),

url(r'^sitemap-(?P<section>.+)\.xml', sitemap, {'sitemaps': sitemaps}),

使用站点地图索引创建站点地图时,站点地图创建为

<sitemap>
<loc>http://localhost.com/sitemap-blog.xml?p=2</loc>
</sitemap>
<sitemap>
<loc>http://localhost.com/sitemap-blog.xml?p=3</loc>
</sitemap>
<sitemap>
<loc>http://localhost.com/sitemap-blog.xml?p=4</loc>
</sitemap>

我想要子域上的站点地图,即 blog.example.com

所以我通过将 absolute_url 更改为 blog.sitemaps 来覆盖 django.contrib.sitemap.views 上的 index View ,如下所示

from django.contrib.sitemaps.views import x_robots_tag
from django.contrib.sites.shortcuts import get_current_site
from django.core import urlresolvers
from django.template.response import TemplateResponse

@x_robots_tag
def index(request, sitemaps,
template_name='sitemap_index.xml', content_type='application/xml',
sitemap_url_name='django.contrib.sitemaps.views.sitemap'):

req_protocol = request.scheme
req_site = get_current_site(request)

sites = []
for section, site in sitemaps.items():
if callable(site):
site = site()
protocol = req_protocol if site.protocol is None else site.protocol
sitemap_url = urlresolvers.reverse(
sitemap_url_name, kwargs={'section': section})
absolute_url = '%s://blog.%s%s' % (protocol, req_site.domain, sitemap_url)
sites.append(absolute_url)
for page in range(2, site.paginator.num_pages + 1):
sites.append('%s?p=%s' % (absolute_url, page))

return TemplateResponse(request, template_name, {'sitemaps': sites},
content_type=content_type)

所以子域索引的输出是这样的,

<sitemap>
<loc>http://blog.localhost.com/sitemap-whos.xml?p=3</loc>
</sitemap>
<sitemap>
<loc>http://blog.localhost.com/sitemap-whos.xml?p=4</loc>
</sitemap>

使 django 站点地图框架获取站点地图 url 的动态子域的正确方法是什么?

我使用 django-subdomains

最佳答案

马蒂!

我找到了一个很好的解决方案来满足我的需求:

  1. 不需要django-subdomains,只需使用取自here 的简单中间件即可:

    class SubdomainMiddleware:
    """ Make the subdomain publicly available to classes """

    def process_request(self, request):
    domain_parts = request.get_host().split('.')
    if (len(domain_parts) > 2):
    subdomain = domain_parts[0]
    if (subdomain.lower() == 'www'):
    subdomain = None
    domain = '.'.join(domain_parts[1:])
    else:
    subdomain = None
    domain = request.get_host()

    request.subdomain = subdomain
    request.domain = domain
  2. 如果您不使用“sitemap index” ' 通过添加两个变量 req_domainreq_subdomain 改变 django.contrib.sitemap.views 中的 sitemap View 在所有请求中:

寻找

    req_protocol = request.scheme
req_site = get_current_site(request)

添加两行:

    req_domain = request.domain
req_subdomain = request.subdomain

然后找到

    urls.extend(site.get_urls(page=page, site=req_site,
protocol=req_protocol))

让它看起来像这样:

    urls.extend(site.get_urls(page=page, site=req_site, r_domain=req_domain, 
r_subdomain=req_subdomain, protocol=req_protocol))
  1. 现在修改 sitemap 根目录中的 __init__.py:

class Sitemap 中使 get_urls 函数看起来像这样 def get_urls(self, page=1, r_domain=None, r_subdomain=None, site=None,协议(protocol)=无)

找到第 domain = site.domain 行,将其注释掉并在下面添加:

domain = r_domain
subdomain = r_subdomain

现在修改下面的代码:

if getattr(self, 'i18n', False):
urls = []
current_lang_code = translation.get_language()
for lang_code, lang_name in settings.LANGUAGES:
translation.activate(lang_code)
urls += self._urls(page, protocol, domain)
translation.activate(current_lang_code)
else:
urls = self._urls(page, protocol, domain)

return urls

看起来像这样:

if getattr(self, 'i18n', False):
urls = []
current_lang_code = translation.get_language()
for lang_code, lang_name in settings.LANGUAGES:
translation.activate(lang_code)
urls += self._urls(page, protocol, domain, subdomain)
translation.activate(current_lang_code)
else:
urls = self._urls(page, protocol, domain, subdomain)

return urls
  1. 在下面找到 def _urls(self, page, protocol, domain) 函数,让它看起来像这样 def _urls(self, page, protocol, domain, subdomain)

并在下面的函数中找到:

loc = "%s://%s%s" % (protocol, domain, self.__get('location', item))

并将其替换为:

loc = "%s://%s.%s%s" % (protocol, subdomain, domain, self.__get('location', item))
  1. 利润!

关于python - 将子域包含到 Django 站点地图 url 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31853371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com