Развернуть шаблоны URL-адресов django

у меня есть стандартные шаблоны URL-адресов django 1.4:

urlpatterns = patterns('',  
    url('^',include('events.urls')),
    url(r'^$', home, {'template_name':'index.html','mod':None}, name='home'),
    url(r'^contact$',contact, {'template_name':'index.html',
        'mod':'contacto'},name='contact'),
    url('^task/(?P<task_id>[\w+-]+)',celery_tasks,name='tasks'),
)

Я хочу создать свой sitemap.xml, оставив некоторые URL-адреса, например, URL-адрес /task не должен отображаться (это не имеет смысла для веб-пауков). Моя стратегия заключается в передаче всех шаблонов URL-адресов моему классу Sitemap, например

from sitemaps import EventsSitemap, StaticSitemap

sitemaps = {
    'Events': CandidateSiteMap,
    'static': StaticSitemap(urlpatterns),
}

Как вы можете видеть, я передаю шаблоны в класс, поэтому позже я могу фильтровать URL-адреса следующим образом.

class StaticSitemap(Sitemap):

    def __init__(self, patterns):
        self.patterns = patterns
        self._items = {}
        self._initialize()

    def _initialize(self):
        do_not_show = ['tasks']
        for p in self.patterns:
            # no dynamic urls in this class (we handle those separately)
            if not p.regex.groups:
                if getattr(p,'name',False) and p.name not in do_not_show:
                   self._items[p.name] = self._get_modification_date(p)

Итак, я сохраняю этот список имен URL-адресов do_not_show, и именно так я отфильтровываю URL-адреса, пока все хорошо, проблема связана с включенными URL-адресами, такими как:

url('^',include('events.urls')),

Я не могу просто повторить self.patterns и получить включенные URL-адреса, я должен сначала расширить их, вот мой вопрос, как я могу это сделать? Как я могу получить плоский список URL-адресов, как если бы не было включенных, все они были в одном модуле URL-адресов.

Мы будем очень признательны за любые рекомендации по фильтрации URL-адресов в файле sitemaps.xml.


person Guillermo Siliceo Trueba    schedule 21.11.2012    source источник


Ответы (1)


Хорошо, я должен ответить на свой вопрос, потому что я решил его, то, что я сделал, было небольшой функцией для расширения шаблонов, подобных этому.

def expand_patterns(patterns):
    new_patterns = []
    def recursive_expand(patterns):
        for p in patterns:
            if getattr(p,'url_patterns',False):
                recursive_expand(p.url_patterns)
            else:
                new_patterns.append(p)
    recursive_expand(patterns)
    return new_patterns

Это объединит шаблоны URL в единый список. Итак, теперь я могу использовать self.patterns, чтобы отфильтровать что-либо в моем классе Sitemap :)

person Guillermo Siliceo Trueba    schedule 21.11.2012