8

我正在使用https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/?from=olddocs

我有一个从 api.mydomain.me 为域生成的站点地图:mydomain.com。

我可以使用 django 指定一个基本 url 吗?

现在使用 location() 方法返回:

api.mydomain.me/page/3123 而不是 mydomain.com/page/3123

这可能吗?谢谢。

4

6 回答 6

15

解决了,我重新定义了自己的get_urls。有用:

class MySitemap(Sitemap):
    changefreq = "never"
    priority = 0.5
    location = ""

    def get_urls(self, site=None, **kwargs):
        site = Site(domain='mydomain.com', name='mydomain.com')
        return super(MySitemap, self).get_urls(site=site, **kwargs)

    def items(self):
        return MyObj.objects.all().order_by('pk')[:1000]

    def lastmod(self, obj):
        return obj.timestamp
于 2012-05-06T16:24:20.210 回答
2

我不知道如何Site使用以前的答案在我的代码中使用,所以我使用了下面的代码:

class Site:
    domain = 'my_site.com'


class MySitemap(Sitemap):
    def get_urls(self, site=None, **kwargs):
        site = Site()
        return super(MySitemap, self).get_urls(site=site, **kwargs)
于 2019-02-25T10:24:54.867 回答
0

你可以尝试这样的事情:

from django.contrib.sites.models import Site, SiteManager

def get_fake_site(self):
    return Site(domain='mydomain.com', name='mydomain.com')

SiteManager.add_to_class('get_current', get_fake_site)

您应该在构建站点地图之前执行此操作,并在之后恢复为默认值。

于 2012-05-03T04:59:06.870 回答
0

如果您有多个站点地图类,则可以使用混合方法。

Django 1.5.1 的示例。

from django.contrib.sitemaps import Sitemap
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from yourapp.models import MyObj


class SiteMapDomainMixin(Sitemap):

    def get_urls(self, page=1, site=None, protocol=None):
        # give a check in https://github.com/django/django/blob/1.5.1/django/contrib/sitemaps/__init__.py
        # There's also a "protocol" argument.
        fake_site = Site(domain='mydomain.com', name='mydomain.com')
        return super(SiteMapDomainMixin, self).get_urls(page, fake_site, protocol=None)


class MySitemap(SiteMapDomainMixin):
    changefreq = "never"
    priority = 0.5

    def items(self):
        return MyObj.objects.all().order_by('pk')[:1000]

    def location(self, item):
        return reverse('url_for_access_myobj', args=(item.slug,))

    def lastmod(self, obj):
        return obj.updated_at



class AnotherSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5

    def items(self):
        return ['url_1', 'url_2', 'url_3',]

    def location(self, item):
        return reverse(item)

urls.py 将类似于...

from sitemaps import MySitemap
from sitemaps import AnotherSitemap
from yourapp.views import SomeDetailMyObjView
admin.autodiscover()

sitemaps = {
    'mysitemap': MySitemap,
    'anothersitemap': AnotherSitemap,
}


urlpatterns = patterns('',
    # other urls...
    url(r'^accessing-myobj/(?P<myobj_slug>[-\w]+)$', SomeDetailMyObjView, name='url_for_access_myobj'),
    (r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)
于 2014-06-04T17:52:05.337 回答
0

我通过创建自定义模板标签来使用补丁并使用该功能替换 url: https ://www.fraydit.com/blogs/wagtail-sitemap-in-docker/

于 2021-07-25T20:27:06.213 回答
0

几乎所有答案都要求您使用Site需要迁移才能工作并将其添加到INSTALLED_APPS.

在我的实例中,我只需要显示正确的 URL,因为我使用 Docker 并且基于我的 docker 配置的基本 URL 是app.

有了这个,你需要做的就是定义一个自定义Site()类,就像我在下面所做的那样,你就可以开始了。


class UserGuideSitemap(sitemaps.Sitemap):
    priority = 1
    changefreq = 'daily'


    def get_urls(self, site=None, protocol=None, **kwargs):
        # we need the url to be site.com
        # SiteToShow() is just a custom class that gives the data needed
        return super().get_urls(site=SiteToShow(), protocol='https', **kwargs)

    def items(self):
        # must import here due to url circular import with urls.py
        from apps.user_guide.urls import urlpatterns as urls
        # get names of urls from base urls
        final_list = list()
        for pattern in urls:
            url_name = pattern.pattern.name
            # there are some urls we do not want
            if url_name not in ['']:
                final_list.append(url_name)

        return final_list

    def location(self, item):
        # return the URL for the sitemap
        return reverse(item)

这是非常简单的SiteToShow类:

class SiteToShow:

    domain = 'site.com'
    name = 'site.com'

    def __str__(self):
        return self.domain
于 2021-11-29T21:02:17.467 回答