Django Sitemap изменить базовый URL-адрес

Я использую 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

Это возможно? Спасибо.


person beddamadre    schedule 30.04.2012    source источник
comment
У вас django.contrib.sites активен? Если вы это сделаете, sitemaps перейдет оттуда к активному сайту.   -  person ilvar    schedule 01.05.2012
comment
Да, ilvar, но я не хочу, чтобы карты сайта забирали сайт оттуда. Я хотел бы указать свой личный базовый URL. Теперь верните: api.mydomain.me/page/3232 (api.mydomains.me это активный сайт), но, что я хочу, это: mydomain.com/page/3213 Понятно?   -  person beddamadre    schedule 01.05.2012
comment
да. Вы можете использовать обезьяну-патч sites, чтобы он возвращал какой-то поддельный сайт с domain, который вам нужен.   -  person ilvar    schedule 02.05.2012
comment
ilvar: Как? Есть подсказки? Примеры?   -  person beddamadre    schedule 02.05.2012


Ответы (4)


Решено, я переопределил свои собственные 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
person beddamadre    schedule 06.05.2012
comment
Работает отлично. Я не знаю, какую версию Django вы используете, но если вы используете Django 1.5.1, это будет работать, только если вы добавите аргумент протокола в функцию get_urls. github.com/django/django/blob/ 1.5.1 / django / contrib / sitemaps / - person Arthur Alvim; 04.06.2014
comment
@deddamadre: Я пробовал, но столкнулся с проблемой get_urls () получил неожиданный аргумент ключевого слова «сайт». Не могли бы вы помочь с тем же? Спасибо в наречии. - person Niks Jain; 05.02.2016

Я не знал, как использовать 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)
person mastisa    schedule 25.02.2019

Вы можете попробовать что-нибудь вроде этого:

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)

Вы должны сделать это перед созданием карты сайта и после нее вернуться к значениям по умолчанию.

person ilvar    schedule 03.05.2012
comment
Маленькая проблема: объект типа "SiteManager" не имеет атрибута "add_to_class" - person beddamadre; 06.05.2012
comment
Да, это только для моделей. Во всяком случае, ваше решение ниже гораздо более подходящее. - person ilvar; 06.05.2012

А если у вас несколько классов Sitemaps, вы можете использовать смешанный подход.

Пример для 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}),
)
person Arthur Alvim    schedule 04.06.2014