2012-11-21 71 views
0

我有標準的Django 1.4 URL模式:展開網址Django的模式

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不應該出現(它是沒有意義的網絡蜘蛛)。 我的策略是通過所有的URL模式到我的網站導航類,像這樣

from sitemaps import EventsSitemap, StaticSitemap 

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

正如你可以看到i'm傳遞模式的課,所以我可以在以後過濾的網址這樣

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_show URL名稱和多數民衆贊成我如何篩選出該URL列表,到目前爲止好,問題是包括網址,如:

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

我不能只是迭代self.patterns並獲得包含的網址,我必須先擴展它們,那是我的問題,我該怎麼做? 我怎樣才能得到一個單位的網址列表,就好像沒有包含的網址一樣,都在單個的url模塊上。

任何建議,以過濾掉sitemaps.xml中的網址將不勝感激。

回答

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類中的任何東西:)