0

私は標準のdjango1.4のURLパターンを持っています:

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'),
)

いくつかのURLを省略してsitemap.xmlを作成したいのですが、たとえば、/ task urlは表示されません(Webスパイダーには意味がありません)。私の戦略は、次のように、すべてのURLパターンをサイトマップクラスに渡すことです。

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)

だから私はこのdo_not_showURL名のリストを保持し、それがURLを除外する方法です。これまでのところ、問題は次のような含まれているURLにあります。

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

self.patternsを繰り返し処理して、含まれているURLを取得することはできません。最初にそれらを展開する必要があります。それが私の質問です。どうすればよいですか?含まれているものがなく、すべてが単一のurlモジュールにあるかのようにURLのフラットリストを取得するにはどうすればよいですか。

sitemaps.xmlでURLを除外するための推奨事項をいただければ幸いです。

4

1 に答える 1

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

これにより、urlpatterns が 1 つのリストにフラット化されます。これで、self.patterns を使用して、Sitemap クラス内のものをすべて除外できます :)

于 2012-11-21T21:11:41.290 に答える